}
g_lamexp_argv;
+//CLI Arguments
+static struct
+{
+ bool bInitialized;
+ lamexp_os_version_t version;
+ QReadWriteLock lock;
+}
+g_lamexp_os_version;
+
//Shared memory
static const struct
{
/*
* Get the native operating system version
*/
-DWORD lamexp_get_os_version(void)
+const lamexp_os_version_t *lamexp_get_os_version(void)
{
- static DWORD osVersion = 0;
+ QReadLocker readLock(&g_lamexp_os_version.lock);
+
+ //Already initialized?
+ if(g_lamexp_os_version.bInitialized)
+ {
+ return &g_lamexp_os_version.version;
+ }
- if(!osVersion)
+ readLock.unlock();
+ QWriteLocker writeLock(&g_lamexp_os_version.lock);
+
+ //Detect OS version
+ if(!g_lamexp_os_version.bInitialized)
{
OSVERSIONINFO osVerInfo;
memset(&osVerInfo, 0, sizeof(OSVERSIONINFO));
if(GetVersionEx(&osVerInfo) == TRUE)
{
- if(osVerInfo.dwPlatformId != VER_PLATFORM_WIN32_NT)
+ if(osVerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
- throw "Ouuups: Not running under Windows NT. This is not supposed to happen!";
+ g_lamexp_os_version.version.versionMajor = osVerInfo.dwMajorVersion;
+ g_lamexp_os_version.version.versionMinor = osVerInfo.dwMinorVersion;
+ }
+ else
+ {
+ qWarning("lamexp_get_os_version: Not running under Windows NT, this is not supposed to happen!");
+ g_lamexp_os_version.version.versionMajor = 0;
+ g_lamexp_os_version.version.versionMinor = 0;
}
- const DWORD osVerHi = (DWORD)(((DWORD)(osVerInfo.dwMajorVersion)) << 16);
- const DWORD osVerLo = (DWORD)(((DWORD)(osVerInfo.dwMinorVersion)) & ((DWORD)(0xffff)));
- osVersion = (DWORD)(((DWORD)(osVerHi)) | ((DWORD)(osVerLo)));
}
else
{
throw "GetVersionEx() has failed. This is not supposed to happen!";
}
+
+ g_lamexp_os_version.bInitialized = true;
}
- return osVersion;
+ return &g_lamexp_os_version.version;
}
/*
break;
default:
{
- DWORD osVersionNo = lamexp_get_os_version();
- if(LAMEXP_EQL_OS_VER(osVersionNo, 6, 2))
+ const lamexp_os_version_t *osVersionNo = lamexp_get_os_version();
+ if(osVersionNo->versionMajor < 5)
+ {
+ qFatal("%s", QApplication::tr("Executable '%1' requires Windows 2000 or later.").arg(executableName).toLatin1().constData());
+ }
+ else if(LAMEXP_EQL_OS_VER(osVersionNo, 6, 2))
{
qDebug("Running on Windows 8 or Windows Server 2012\n");
lamexp_check_compatibility_mode(NULL, executableName);
}
else
{
- qWarning("Running on an unknown/untested WinNT-based OS (v%u.%u).\n", HIWORD(osVersionNo), LOWORD(osVersionNo));
+ qWarning("Running on an unknown/untested WinNT-based OS (v%u.%u).\n", osVersionNo->versionMajor, osVersionNo->versionMinor);
}
}
break;
LAMEXP_ZERO_MEMORY(g_lamexp_translation);
LAMEXP_ZERO_MEMORY(g_lamexp_folder);
LAMEXP_ZERO_MEMORY(g_lamexp_ipc_ptr);
+ LAMEXP_ZERO_MEMORY(g_lamexp_os_version);
//Make sure we will pass the check
g_lamexp_entry_check_flag = ~g_lamexp_entry_check_flag;
}
lamexp_event_t;
+//OS version number
+typedef struct
+{
+ unsigned int versionMajor;
+ unsigned int versionMinor;
+}
+lamexp_os_version_t;
+
//LameXP version info
unsigned int lamexp_version_major(void);
unsigned int lamexp_version_minor(void);
unsigned int lamexp_toolver_coreaudio(void);
const char *lamexp_website_url(void);
const char *lamexp_support_url(void);
-DWORD lamexp_get_os_version(void);
+const lamexp_os_version_t *lamexp_get_os_version(void);
bool lamexp_detect_wine(void);
//Public functions
#define LAMEXP_DELETE_ARRAY(PTR) do { if(PTR) { delete [] PTR; PTR = NULL; } } while(0)
#define LAMEXP_SAFE_FREE(PTR) do { if(PTR) { free((void*) PTR); PTR = NULL; } } while(0)
#define LAMEXP_CLOSE(HANDLE) do { if(HANDLE != NULL && HANDLE != INVALID_HANDLE_VALUE) { CloseHandle(HANDLE); HANDLE = NULL; } } while(0)
-#define LAMEXP_MIN_OS_VER(VER_INFO, VER_MAJ, VER_MIN) ((HIWORD(VER_INFO) > (VER_MAJ)) || ((HIWORD(VER_INFO) == (VER_MAJ)) && (LOWORD(VER_INFO) >= (VER_MIN))))
-#define LAMEXP_MAX_OS_VER(VER_INFO, VER_MAJ, VER_MIN) ((HIWORD(VER_INFO) < (VER_MAJ)) || ((HIWORD(VER_INFO) == (VER_MAJ)) && (LOWORD(VER_INFO) <= (VER_MIN))))
-#define LAMEXP_EQL_OS_VER(VER_INFO, VER_MAJ, VER_MIN) ((HIWORD(VER_INFO) == (VER_MAJ)) && (LOWORD(VER_INFO) == (VER_MIN)))
+#define LAMEXP_MIN_OS_VER(VER_INFO, VER_MAJ, VER_MIN) (((VER_INFO)->versionMajor > (VER_MAJ)) || (((VER_INFO)->versionMajor == (VER_MAJ)) && ((VER_INFO)->versionMinor >= (VER_MIN))))
+#define LAMEXP_MAX_OS_VER(VER_INFO, VER_MAJ, VER_MIN) (((VER_INFO)->versionMajor < (VER_MAJ)) || (((VER_INFO)->versionMajor == (VER_MAJ)) && ((VER_INFO)->versionMinor <= (VER_MIN))))
+#define LAMEXP_EQL_OS_VER(VER_INFO, VER_MAJ, VER_MIN) (((VER_INFO)->versionMajor == (VER_MAJ)) && ((VER_INFO)->versionMinor == (VER_MIN)))
#define QWCHAR(STR) reinterpret_cast<const wchar_t*>(STR.utf16())
#define WCHAR2QSTR(STR) QString::fromUtf16(reinterpret_cast<const unsigned short*>(STR))
#define LAMEXP_BOOL2STR(X) (X ? "1" : "0")