// From smartmontools os_win32.cpp void GetWindowsVersion(void) { OSVERSIONINFOEXA vi, vi2; const char* w = 0; const char* w64 = "32 bit"; char *vptr, build_number[10] = ""; size_t vlen; unsigned major, minor; ULONGLONG major_equal, minor_equal; BOOL ws; nWindowsVersion = WINDOWS_UNDEFINED; safe_strcpy(WindowsVersionStr, sizeof(WindowsVersionStr), "Windows Undefined"); memset(&vi, 0, sizeof(vi)); vi.dwOSVersionInfoSize = sizeof(vi); if (!GetVersionExA((OSVERSIONINFOA *)&vi)) { memset(&vi, 0, sizeof(vi)); vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA); if (!GetVersionExA((OSVERSIONINFOA *)&vi)) return; } if (vi.dwPlatformId == VER_PLATFORM_WIN32_NT) { if (vi.dwMajorVersion > 6 || (vi.dwMajorVersion == 6 && vi.dwMinorVersion >= 2)) { // Starting with Windows 8.1 Preview, GetVersionEx() does no longer report the actual OS version // See: http://msdn.microsoft.com/en-us/library/windows/desktop/dn302074.aspx // And starting with Windows 10 Preview 2, Windows enforces the use of the application/supportedOS // manifest in order for VerSetConditionMask() to report the ACTUAL OS major and minor... major_equal = VerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL); for (major = vi.dwMajorVersion; major <= 9; major++) { memset(&vi2, 0, sizeof(vi2)); vi2.dwOSVersionInfoSize = sizeof(vi2); vi2.dwMajorVersion = major; if (!VerifyVersionInfoA(&vi2, VER_MAJORVERSION, major_equal)) continue; if (vi.dwMajorVersion < major) { vi.dwMajorVersion = major; vi.dwMinorVersion = 0; } minor_equal = VerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL); for (minor = vi.dwMinorVersion; minor <= 9; minor++) { memset(&vi2, 0, sizeof(vi2)); vi2.dwOSVersionInfoSize = sizeof(vi2); vi2.dwMinorVersion = minor; if (!VerifyVersionInfoA(&vi2, VER_MINORVERSION, minor_equal)) continue; vi.dwMinorVersion = minor; break; } break; } } if (vi.dwMajorVersion <= 0xf && vi.dwMinorVersion <= 0xf) { ws = (vi.wProductType <= VER_NT_WORKSTATION); nWindowsVersion = vi.dwMajorVersion << 4 | vi.dwMinorVersion; switch (nWindowsVersion) { case 0x51: w = "XP"; break; case 0x52: w = (!GetSystemMetrics(89)?"2003":"2003_R2"); break; case 0x60: w = (ws?"Vista":"2008"); break; case 0x61: w = (ws?"7":"2008_R2"); break; case 0x62: w = (ws?"8":"2012"); break; case 0x63: w = (ws?"8.1":"2012_R2"); break; case 0x64: w = (ws?"10 (Preview 1)":"Server 10 (Preview 1)"); break; // Starting with Windows 10 Preview 2, the major is the same as the public-facing version case 0xA0: w = (ws?"10":"Server 10"); break; default: if (nWindowsVersion < 0x51) nWindowsVersion = WINDOWS_UNSUPPORTED; else w = "11 or later"; break; } } } if (is_x64()) w64 = "64-bit"; vptr = &WindowsVersionStr[sizeof("Windows ") - 1]; vlen = sizeof(WindowsVersionStr) - sizeof("Windows ") - 1; if (!w) safe_sprintf(vptr, vlen, "%s %u.%u %s", (vi.dwPlatformId==VER_PLATFORM_WIN32_NT?"NT":"??"), (unsigned)vi.dwMajorVersion, (unsigned)vi.dwMinorVersion, w64); else if (vi.wServicePackMinor) safe_sprintf(vptr, vlen, "%s SP%u.%u %s", w, vi.wServicePackMajor, vi.wServicePackMinor, w64); else if (vi.wServicePackMajor) safe_sprintf(vptr, vlen, "%s SP%u %s", w, vi.wServicePackMajor, w64); else safe_sprintf(vptr, vlen, "%s %s", w, w64); // Add the build number for Windows 8.0 and later if (nWindowsVersion >= 0x62) { GetRegistryKeyStr(REGKEY_HKLM, "Microsoft\\Windows NT\\CurrentVersion\\CurrentBuildNumber", build_number, sizeof(build_number)); if (build_number[0] != 0) { safe_strcat(WindowsVersionStr, sizeof(WindowsVersionStr), " (Build "); safe_strcat(WindowsVersionStr, sizeof(WindowsVersionStr), build_number); safe_strcat(WindowsVersionStr, sizeof(WindowsVersionStr), ")"); } } }
static void get_windows_version(void) { OSVERSIONINFOEXA vi, vi2; const char *arch, *w = NULL; unsigned major, minor, version; ULONGLONG major_equal, minor_equal; BOOL ws; windows_version = WINDOWS_UNDEFINED; memset(&vi, 0, sizeof(vi)); vi.dwOSVersionInfoSize = sizeof(vi); if (!GetVersionExA((OSVERSIONINFOA *)&vi)) { memset(&vi, 0, sizeof(vi)); vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA); if (!GetVersionExA((OSVERSIONINFOA *)&vi)) return; } if (vi.dwPlatformId != VER_PLATFORM_WIN32_NT) return; if ((vi.dwMajorVersion > 6) || ((vi.dwMajorVersion == 6) && (vi.dwMinorVersion >= 2))) { // Starting with Windows 8.1 Preview, GetVersionEx() does no longer report the actual OS version // See: http://msdn.microsoft.com/en-us/library/windows/desktop/dn302074.aspx major_equal = VerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL); for (major = vi.dwMajorVersion; major <= 9; major++) { memset(&vi2, 0, sizeof(vi2)); vi2.dwOSVersionInfoSize = sizeof(vi2); vi2.dwMajorVersion = major; if (!VerifyVersionInfoA(&vi2, VER_MAJORVERSION, major_equal)) continue; if (vi.dwMajorVersion < major) { vi.dwMajorVersion = major; vi.dwMinorVersion = 0; } minor_equal = VerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL); for (minor = vi.dwMinorVersion; minor <= 9; minor++) { memset(&vi2, 0, sizeof(vi2)); vi2.dwOSVersionInfoSize = sizeof(vi2); vi2.dwMinorVersion = minor; if (!VerifyVersionInfoA(&vi2, VER_MINORVERSION, minor_equal)) continue; vi.dwMinorVersion = minor; break; } break; } } if ((vi.dwMajorVersion > 0xf) || (vi.dwMinorVersion > 0xf)) return; ws = (vi.wProductType <= VER_NT_WORKSTATION); version = vi.dwMajorVersion << 4 | vi.dwMinorVersion; switch (version) { case 0x50: windows_version = WINDOWS_2000; w = "2000"; break; case 0x51: windows_version = WINDOWS_XP; w = "XP"; break; case 0x52: windows_version = WINDOWS_2003; w = "2003"; break; case 0x60: windows_version = WINDOWS_VISTA; w = (ws ? "Vista" : "2008"); break; case 0x61: windows_version = WINDOWS_7; w = (ws ? "7" : "2008_R2"); break; case 0x62: windows_version = WINDOWS_8; w = (ws ? "8" : "2012"); break; case 0x63: windows_version = WINDOWS_8_1; w = (ws ? "8.1" : "2012_R2"); break; case 0x64: windows_version = WINDOWS_10; w = (ws ? "10" : "2016"); break; default: if (version < 0x50) { return; } else { windows_version = WINDOWS_11_OR_LATER; w = "11 or later"; } } arch = is_x64() ? "64-bit" : "32-bit"; if (vi.wServicePackMinor) usbi_dbg("Windows %s SP%u.%u %s", w, vi.wServicePackMajor, vi.wServicePackMinor, arch); else if (vi.wServicePackMajor) usbi_dbg("Windows %s SP%u %s", w, vi.wServicePackMajor, arch); else usbi_dbg("Windows %s %s", w, arch); }
// From smartmontools os_win32.cpp void GetWindowsVersion(void) { OSVERSIONINFOEXA vi, vi2; const char* w = 0; const char* w64 = "32 bit"; char* vptr; size_t vlen; unsigned major, minor; ULONGLONG major_equal, minor_equal; BOOL ws; nWindowsVersion = WINDOWS_UNDEFINED; safe_strcpy(WindowsVersionStr, sizeof(WindowsVersionStr), "Windows Undefined"); memset(&vi, 0, sizeof(vi)); vi.dwOSVersionInfoSize = sizeof(vi); if (!GetVersionExA((OSVERSIONINFOA *)&vi)) { memset(&vi, 0, sizeof(vi)); vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA); if (!GetVersionExA((OSVERSIONINFOA *)&vi)) return; } if (vi.dwPlatformId == VER_PLATFORM_WIN32_NT) { if (vi.dwMajorVersion > 6 || (vi.dwMajorVersion == 6 && vi.dwMinorVersion >= 2)) { // Starting with Windows 8.1 Preview, GetVersionEx() does no longer report the actual OS version // See: http://msdn.microsoft.com/en-us/library/windows/desktop/dn302074.aspx major_equal = VerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL); for (major = vi.dwMajorVersion; major <= 9; major++) { memset(&vi2, 0, sizeof(vi2)); vi2.dwOSVersionInfoSize = sizeof(vi2); vi2.dwMajorVersion = major; if (!VerifyVersionInfoA(&vi2, VER_MAJORVERSION, major_equal)) continue; if (vi.dwMajorVersion < major) { vi.dwMajorVersion = major; vi.dwMinorVersion = 0; } minor_equal = VerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL); for (minor = vi.dwMinorVersion; minor <= 9; minor++) { memset(&vi2, 0, sizeof(vi2)); vi2.dwOSVersionInfoSize = sizeof(vi2); vi2.dwMinorVersion = minor; if (!VerifyVersionInfoA(&vi2, VER_MINORVERSION, minor_equal)) continue; vi.dwMinorVersion = minor; break; } break; } } if (vi.dwMajorVersion <= 0xf && vi.dwMinorVersion <= 0xf) { ws = (vi.wProductType <= VER_NT_WORKSTATION); nWindowsVersion = vi.dwMajorVersion << 4 | vi.dwMinorVersion; switch (nWindowsVersion) { case 0x50: w = "2000"; break; case 0x51: w = "XP"; break; case 0x52: w = (!GetSystemMetrics(89)?"2003":"2003_R2"); break; case 0x60: w = (ws?"Vista":"2008"); break; case 0x61: w = (ws?"7":"2008_R2"); break; case 0x62: w = (ws?"8":"2012"); break; case 0x63: w = (ws?"8.1":"2012_R2"); break; case 0x64: w = (ws?"8.2":"2012_R3"); break; default: if (nWindowsVersion < 0x50) nWindowsVersion = WINDOWS_UNSUPPORTED; else w = "9 or later"; break; } } } if (is_x64()) w64 = "64-bit"; vptr = &WindowsVersionStr[sizeof("Windows ") - 1]; vlen = sizeof(WindowsVersionStr) - sizeof("Windows ") - 1; if (!w) safe_sprintf(vptr, vlen, "%s %u.%u %s", (vi.dwPlatformId==VER_PLATFORM_WIN32_NT?"NT":"??"), (unsigned)vi.dwMajorVersion, (unsigned)vi.dwMinorVersion, w64); else if (vi.wServicePackMinor) safe_sprintf(vptr, vlen, "%s SP%u.%u %s", w, vi.wServicePackMajor, vi.wServicePackMinor, w64); else if (vi.wServicePackMajor) safe_sprintf(vptr, vlen, "%s SP%u %s", w, vi.wServicePackMajor, w64); else safe_sprintf(vptr, vlen, "%s %s", w, w64); }
static int Init(HMODULE hModule) { char szIniPath[MAX_PATH + 16] = { '\0' }; GetModuleFileNameA(hModule, szIniPath, MAX_PATH); char *p = strrchr(szIniPath, '.'); if (!p) return -1; p++; strcpy(p, "ini"); HANDLE hFile = CreateFileA(szIniPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) return -2; CloseHandle(hFile); GetPrivateProfileStringA("OPTION", "ADDRESS", "127.0.0.1", g_Host, sizeof(g_Host), szIniPath); GetPrivateProfileStringA("OPTION", "PORT", "1192", g_Port, sizeof(g_Port), szIniPath); g_SandBoxedRelease = GetPrivateProfileIntA("OPTION", "SANDBOXED_RELEASE", 0, szIniPath); g_DisableUnloadBonDriver = GetPrivateProfileIntA("OPTION", "DISABLE_UNLOAD_BONDRIVER", 0, szIniPath); g_PacketFifoSize = GetPrivateProfileIntA("SYSTEM", "PACKET_FIFO_SIZE", 64, szIniPath); g_TsPacketBufSize = GetPrivateProfileIntA("SYSTEM", "TSPACKET_BUFSIZE", (188 * 1024), szIniPath); char szPriority[128]; GetPrivateProfileStringA("SYSTEM", "PROCESSPRIORITY", "NORMAL", szPriority, sizeof(szPriority), szIniPath); if (strcmp(szPriority, "REALTIME") == 0) g_ProcessPriority = REALTIME_PRIORITY_CLASS; else if (strcmp(szPriority, "HIGH") == 0) g_ProcessPriority = HIGH_PRIORITY_CLASS; else if (strcmp(szPriority, "ABOVE_NORMAL") == 0) g_ProcessPriority = ABOVE_NORMAL_PRIORITY_CLASS; else if (strcmp(szPriority, "BELOW_NORMAL") == 0) g_ProcessPriority = BELOW_NORMAL_PRIORITY_CLASS; else if (strcmp(szPriority, "IDLE") == 0) g_ProcessPriority = IDLE_PRIORITY_CLASS; else g_ProcessPriority = NORMAL_PRIORITY_CLASS; SetPriorityClass(GetCurrentProcess(), g_ProcessPriority); GetPrivateProfileStringA("SYSTEM", "THREADPRIORITY_TSREADER", "NORMAL", szPriority, sizeof(szPriority), szIniPath); if (strcmp(szPriority, "CRITICAL") == 0) g_ThreadPriorityTsReader = THREAD_PRIORITY_TIME_CRITICAL; else if (strcmp(szPriority, "HIGHEST") == 0) g_ThreadPriorityTsReader = THREAD_PRIORITY_HIGHEST; else if (strcmp(szPriority, "ABOVE_NORMAL") == 0) g_ThreadPriorityTsReader = THREAD_PRIORITY_ABOVE_NORMAL; else if (strcmp(szPriority, "BELOW_NORMAL") == 0) g_ThreadPriorityTsReader = THREAD_PRIORITY_BELOW_NORMAL; else if (strcmp(szPriority, "LOWEST") == 0) g_ThreadPriorityTsReader = THREAD_PRIORITY_LOWEST; else if (strcmp(szPriority, "IDLE") == 0) g_ThreadPriorityTsReader = THREAD_PRIORITY_IDLE; else g_ThreadPriorityTsReader = THREAD_PRIORITY_NORMAL; GetPrivateProfileStringA("SYSTEM", "THREADPRIORITY_SENDER", "NORMAL", szPriority, sizeof(szPriority), szIniPath); if (strcmp(szPriority, "CRITICAL") == 0) g_ThreadPrioritySender = THREAD_PRIORITY_TIME_CRITICAL; else if (strcmp(szPriority, "HIGHEST") == 0) g_ThreadPrioritySender = THREAD_PRIORITY_HIGHEST; else if (strcmp(szPriority, "ABOVE_NORMAL") == 0) g_ThreadPrioritySender = THREAD_PRIORITY_ABOVE_NORMAL; else if (strcmp(szPriority, "BELOW_NORMAL") == 0) g_ThreadPrioritySender = THREAD_PRIORITY_BELOW_NORMAL; else if (strcmp(szPriority, "LOWEST") == 0) g_ThreadPrioritySender = THREAD_PRIORITY_LOWEST; else if (strcmp(szPriority, "IDLE") == 0) g_ThreadPrioritySender = THREAD_PRIORITY_IDLE; else g_ThreadPrioritySender = THREAD_PRIORITY_NORMAL; OSVERSIONINFOEXA osvi = {}; osvi.dwOSVersionInfoSize = sizeof(osvi); osvi.dwMajorVersion = 6; // >= Vista if (VerifyVersionInfoA(&osvi, VER_MAJORVERSION, VerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL))) g_ThreadExecutionState = ES_SYSTEM_REQUIRED | ES_CONTINUOUS | ES_AWAYMODE_REQUIRED; else g_ThreadExecutionState = ES_SYSTEM_REQUIRED | ES_CONTINUOUS; return 0; }