Improved lamexp_get_os_version() function.

This commit is contained in:
LoRd_MuldeR 2012-09-09 23:05:00 +02:00
parent e5f493a822
commit 7f3bcbedb7
5 changed files with 57 additions and 19 deletions

View File

@ -30,7 +30,7 @@
#define VER_LAMEXP_MINOR_LO 5 #define VER_LAMEXP_MINOR_LO 5
#define VER_LAMEXP_TYPE Final #define VER_LAMEXP_TYPE Final
#define VER_LAMEXP_PATCH 2 #define VER_LAMEXP_PATCH 2
#define VER_LAMEXP_BUILD 1102 #define VER_LAMEXP_BUILD 1103
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// Tool versions (minimum expected versions!) // Tool versions (minimum expected versions!)

View File

@ -245,6 +245,15 @@ static struct
} }
g_lamexp_argv; g_lamexp_argv;
//CLI Arguments
static struct
{
bool bInitialized;
lamexp_os_version_t version;
QReadWriteLock lock;
}
g_lamexp_os_version;
//Shared memory //Shared memory
static const struct static const struct
{ {
@ -376,11 +385,21 @@ const QDate &lamexp_version_date(void)
/* /*
* Get the native operating system version * 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);
if(!osVersion) //Already initialized?
if(g_lamexp_os_version.bInitialized)
{
return &g_lamexp_os_version.version;
}
readLock.unlock();
QWriteLocker writeLock(&g_lamexp_os_version.lock);
//Detect OS version
if(!g_lamexp_os_version.bInitialized)
{ {
OSVERSIONINFO osVerInfo; OSVERSIONINFO osVerInfo;
memset(&osVerInfo, 0, sizeof(OSVERSIONINFO)); memset(&osVerInfo, 0, sizeof(OSVERSIONINFO));
@ -388,21 +407,27 @@ DWORD lamexp_get_os_version(void)
if(GetVersionEx(&osVerInfo) == TRUE) 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 else
{ {
throw "GetVersionEx() has failed. This is not supposed to happen!"; throw "GetVersionEx() has failed. This is not supposed to happen!";
} }
g_lamexp_os_version.bInitialized = true;
} }
return osVersion; return &g_lamexp_os_version.version;
} }
/* /*
@ -1131,15 +1156,19 @@ bool lamexp_init_qt(int argc, char* argv[])
break; break;
default: default:
{ {
DWORD osVersionNo = lamexp_get_os_version(); const lamexp_os_version_t *osVersionNo = lamexp_get_os_version();
if(LAMEXP_EQL_OS_VER(osVersionNo, 6, 2)) 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"); qDebug("Running on Windows 8 or Windows Server 2012\n");
lamexp_check_compatibility_mode(NULL, executableName); lamexp_check_compatibility_mode(NULL, executableName);
} }
else 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; break;
@ -2222,6 +2251,7 @@ extern "C"
LAMEXP_ZERO_MEMORY(g_lamexp_translation); LAMEXP_ZERO_MEMORY(g_lamexp_translation);
LAMEXP_ZERO_MEMORY(g_lamexp_folder); LAMEXP_ZERO_MEMORY(g_lamexp_folder);
LAMEXP_ZERO_MEMORY(g_lamexp_ipc_ptr); LAMEXP_ZERO_MEMORY(g_lamexp_ipc_ptr);
LAMEXP_ZERO_MEMORY(g_lamexp_os_version);
//Make sure we will pass the check //Make sure we will pass the check
g_lamexp_entry_check_flag = ~g_lamexp_entry_check_flag; g_lamexp_entry_check_flag = ~g_lamexp_entry_check_flag;

View File

@ -83,6 +83,14 @@ typedef enum
} }
lamexp_event_t; lamexp_event_t;
//OS version number
typedef struct
{
unsigned int versionMajor;
unsigned int versionMinor;
}
lamexp_os_version_t;
//LameXP version info //LameXP version info
unsigned int lamexp_version_major(void); unsigned int lamexp_version_major(void);
unsigned int lamexp_version_minor(void); unsigned int lamexp_version_minor(void);
@ -100,7 +108,7 @@ unsigned int lamexp_toolver_qaacenc(void);
unsigned int lamexp_toolver_coreaudio(void); unsigned int lamexp_toolver_coreaudio(void);
const char *lamexp_website_url(void); const char *lamexp_website_url(void);
const char *lamexp_support_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); bool lamexp_detect_wine(void);
//Public functions //Public functions
@ -156,9 +164,9 @@ SIZE_T lamexp_dbg_private_bytes(void);
#define LAMEXP_DELETE_ARRAY(PTR) do { if(PTR) { delete [] PTR; PTR = NULL; } } while(0) #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_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_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_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) ((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) (((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) ((HIWORD(VER_INFO) == (VER_MAJ)) && (LOWORD(VER_INFO) == (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 QWCHAR(STR) reinterpret_cast<const wchar_t*>(STR.utf16())
#define WCHAR2QSTR(STR) QString::fromUtf16(reinterpret_cast<const unsigned short*>(STR)) #define WCHAR2QSTR(STR) QString::fromUtf16(reinterpret_cast<const unsigned short*>(STR))
#define LAMEXP_BOOL2STR(X) (X ? "1" : "0") #define LAMEXP_BOOL2STR(X) (X ? "1" : "0")

View File

@ -268,7 +268,7 @@ bool QFileSystemModelEx::hasSubfolders(const QString &path)
if(kernel32Lib.load()) if(kernel32Lib.load())
{ {
FindFirstFileExPtr = kernel32Lib.resolve("FindFirstFileExW"); FindFirstFileExPtr = kernel32Lib.resolve("FindFirstFileExW");
DWORD osVersionNo = lamexp_get_os_version(); const lamexp_os_version_t *osVersionNo = lamexp_get_os_version();
FindFirstFileExInfoBasicOK = LAMEXP_MIN_OS_VER(osVersionNo, 6, 1); FindFirstFileExInfoBasicOK = LAMEXP_MIN_OS_VER(osVersionNo, 6, 1);
} }
FindFirstFileExInitialized = true; FindFirstFileExInitialized = true;

View File

@ -63,7 +63,7 @@ AbstractTool::AbstractTool(void)
if(s_jobObjRefCount < 1U) if(s_jobObjRefCount < 1U)
{ {
DWORD osVersionNo = lamexp_get_os_version(); const lamexp_os_version_t *osVersionNo = lamexp_get_os_version();
if(LAMEXP_MIN_OS_VER(osVersionNo, 5, 1)) if(LAMEXP_MIN_OS_VER(osVersionNo, 5, 1))
{ {
if((!CreateJobObjectPtr) || (!SetInformationJobObjectPtr)) if((!CreateJobObjectPtr) || (!SetInformationJobObjectPtr))