diff options
author | Gerald Combs <gerald@wireshark.org> | 2018-06-25 17:38:19 -0700 |
---|---|---|
committer | Gerald Combs <gerald@wireshark.org> | 2018-06-26 20:30:02 +0000 |
commit | c74dba69fc4118e1d81c2bdcbc6ba52fd5a465d5 (patch) | |
tree | 80fdeb8e41e594fc26407bda2c39692870445cbb /wsutil | |
parent | 1437b421a29e361d3669e5c27ae22906efbd0832 (diff) |
Windows: Fetch our version using RtlGetVersion.
GetVersionEx is deprecated. Use RtlGetVersion instead. Remove
get_windows_major_version since it's no longer needed.
Change-Id: I02f6458608c2328a96a0ac71c6b1f9187babd049
Reviewed-on: https://code.wireshark.org/review/28443
Petri-Dish: Gerald Combs <gerald@wireshark.org>
Reviewed-by: Guy Harris <guy@alum.mit.edu>
Tested-by: Petri Dish Buildbot
Reviewed-by: Gerald Combs <gerald@wireshark.org>
Diffstat (limited to 'wsutil')
-rw-r--r-- | wsutil/os_version_info.c | 124 | ||||
-rw-r--r-- | wsutil/os_version_info.h | 7 |
2 files changed, 54 insertions, 77 deletions
diff --git a/wsutil/os_version_info.c b/wsutil/os_version_info.c index b9aeaf2477..0f8ac7f1e0 100644 --- a/wsutil/os_version_info.c +++ b/wsutil/os_version_info.c @@ -179,6 +179,13 @@ get_macos_version_info(GString *str) } #endif +#ifdef _WIN32 +typedef LONG (WINAPI * RtlGetVersionProc) (OSVERSIONINFOEX *); +#ifndef STATUS_SUCCESS +#define STATUS_SUCCESS 0 +#endif +#endif // _WIN32 + /* * Get the OS version, and append it to the GString */ @@ -186,34 +193,33 @@ void get_os_version_info(GString *str) { #if defined(_WIN32) - OSVERSIONINFOEX info; - SYSTEM_INFO system_info; -#elif defined(HAVE_SYS_UTSNAME_H) - struct utsname name; -#endif -#if defined(_WIN32) + OSVERSIONINFOEX win_version_info = {0}; + RtlGetVersionProc RtlGetVersionP = 0; + LONG version_status = STATUS_ENTRYPOINT_NOT_FOUND; // Any nonzero value should work. + /* - * See - * - * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/getting_the_system_version.asp - * - * for more than you ever wanted to know about determining the - * flavor of Windows on which you're running. Implementing more - * of that is left as an exercise to the reader - who should - * check any copyright information about code samples on MSDN - * before cutting and pasting into Wireshark. - * - * They should also note that you need an OSVERSIONINFOEX structure - * to get some of that information, and that not only is that - * structure not supported on older versions of Windows, you might - * not even be able to compile code that *uses* that structure with - * older versions of the SDK. + * We want the major and minor Windows version along with other + * information. GetVersionEx provides this, but is deprecated. + * We use RtlGetVersion instead, which requires a bit of extra + * effort. */ - memset(&info, '\0', sizeof info); - info.dwOSVersionInfoSize = sizeof info; - if (!GetVersionEx((OSVERSIONINFO *)&info)) { + HMODULE ntdll_module = LoadLibrary(_T("ntdll.dll")); + if (ntdll_module) { + RtlGetVersionP = (RtlGetVersionProc) GetProcAddress(ntdll_module, "RtlGetVersion"); + } + + if (RtlGetVersionP) { + win_version_info.dwOSVersionInfoSize = sizeof(win_version_info); + version_status = RtlGetVersionP(&win_version_info); + } + + if (ntdll_module) { + FreeLibrary(ntdll_module); + } + + if (version_status != STATUS_SUCCESS) { /* * XXX - get the failure reason. */ @@ -221,12 +227,13 @@ get_os_version_info(GString *str) return; } + SYSTEM_INFO system_info; memset(&system_info, '\0', sizeof system_info); /* Look for and use the GetNativeSystemInfo() function to get the correct processor architecture * even when running 32-bit Wireshark in WOW64 (x86 emulation on 64-bit Windows) */ GetNativeSystemInfo(&system_info); - switch (info.dwPlatformId) { + switch (win_version_info.dwPlatformId) { case VER_PLATFORM_WIN32s: /* Shyeah, right. */ @@ -235,11 +242,11 @@ get_os_version_info(GString *str) case VER_PLATFORM_WIN32_WINDOWS: /* Windows OT */ - switch (info.dwMajorVersion) { + switch (win_version_info.dwMajorVersion) { case 4: /* 3 cheers for Microsoft marketing! */ - switch (info.dwMinorVersion) { + switch (win_version_info.dwMinorVersion) { case 0: g_string_append_printf(str, "Windows 95"); @@ -255,31 +262,31 @@ get_os_version_info(GString *str) default: g_string_append_printf(str, "Windows OT, unknown version %lu.%lu", - info.dwMajorVersion, info.dwMinorVersion); + win_version_info.dwMajorVersion, win_version_info.dwMinorVersion); break; } break; default: g_string_append_printf(str, "Windows OT, unknown version %lu.%lu", - info.dwMajorVersion, info.dwMinorVersion); + win_version_info.dwMajorVersion, win_version_info.dwMinorVersion); break; } break; case VER_PLATFORM_WIN32_NT: /* Windows NT */ - switch (info.dwMajorVersion) { + switch (win_version_info.dwMajorVersion) { case 3: case 4: g_string_append_printf(str, "Windows NT %lu.%lu", - info.dwMajorVersion, info.dwMinorVersion); + win_version_info.dwMajorVersion, win_version_info.dwMinorVersion); break; case 5: /* 3 cheers for Microsoft marketing! */ - switch (info.dwMinorVersion) { + switch (win_version_info.dwMinorVersion) { case 0: g_string_append_printf(str, "Windows 2000"); @@ -290,7 +297,7 @@ get_os_version_info(GString *str) break; case 2: - if ((info.wProductType == VER_NT_WORKSTATION) && + if ((win_version_info.wProductType == VER_NT_WORKSTATION) && (system_info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)) { g_string_append_printf(str, "Windows XP Professional x64 Edition"); } else { @@ -302,7 +309,7 @@ get_os_version_info(GString *str) default: g_string_append_printf(str, "Windows NT, unknown version %lu.%lu", - info.dwMajorVersion, info.dwMinorVersion); + win_version_info.dwMajorVersion, win_version_info.dwMinorVersion); break; } break; @@ -316,11 +323,11 @@ get_os_version_info(GString *str) g_string_append(str, "32-bit "); #ifndef VER_NT_WORKSTATION #define VER_NT_WORKSTATION 0x01 - is_nt_workstation = ((info.wReserved[1] & 0xff) == VER_NT_WORKSTATION); + is_nt_workstation = ((win_version_info.wReserved[1] & 0xff) == VER_NT_WORKSTATION); #else - is_nt_workstation = (info.wProductType == VER_NT_WORKSTATION); + is_nt_workstation = (win_version_info.wProductType == VER_NT_WORKSTATION); #endif - switch (info.dwMinorVersion) { + switch (win_version_info.dwMinorVersion) { case 0: g_string_append_printf(str, is_nt_workstation ? "Windows Vista" : "Windows Server 2008"); break; @@ -335,7 +342,7 @@ get_os_version_info(GString *str) break; default: g_string_append_printf(str, "Windows NT, unknown version %lu.%lu", - info.dwMajorVersion, info.dwMinorVersion); + win_version_info.dwMajorVersion, win_version_info.dwMinorVersion); break; } break; @@ -348,14 +355,14 @@ get_os_version_info(GString *str) g_string_append(str, "64-bit "); else if (system_info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) g_string_append(str, "32-bit "); - is_nt_workstation = (info.wProductType == VER_NT_WORKSTATION); - switch (info.dwMinorVersion) { + is_nt_workstation = (win_version_info.wProductType == VER_NT_WORKSTATION); + switch (win_version_info.dwMinorVersion) { case 0: g_string_append_printf(str, is_nt_workstation ? "Windows 10" : "Windows Server 2016"); break; default: g_string_append_printf(str, "Windows NT, unknown version %lu.%lu", - info.dwMajorVersion, info.dwMinorVersion); + win_version_info.dwMajorVersion, win_version_info.dwMinorVersion); break; } break; @@ -363,20 +370,21 @@ get_os_version_info(GString *str) default: g_string_append_printf(str, "Windows NT, unknown version %lu.%lu", - info.dwMajorVersion, info.dwMinorVersion); + win_version_info.dwMajorVersion, win_version_info.dwMinorVersion); break; } /* info.dwMajorVersion */ break; default: g_string_append_printf(str, "Unknown Windows platform %lu version %lu.%lu", - info.dwPlatformId, info.dwMajorVersion, info.dwMinorVersion); + win_version_info.dwPlatformId, win_version_info.dwMajorVersion, win_version_info.dwMinorVersion); break; } - if (info.szCSDVersion[0] != '\0') - g_string_append_printf(str, " %s", utf_16to8(info.szCSDVersion)); - g_string_append_printf(str, ", build %lu", info.dwBuildNumber); + if (win_version_info.szCSDVersion[0] != '\0') + g_string_append_printf(str, " %s", utf_16to8(win_version_info.szCSDVersion)); + g_string_append_printf(str, ", build %lu", win_version_info.dwBuildNumber); #elif defined(HAVE_SYS_UTSNAME_H) + struct utsname name; /* * We have <sys/utsname.h>, so we assume we have "uname()". */ @@ -495,30 +503,6 @@ get_os_version_info(GString *str) #endif } -#if defined(_WIN32) -/* - * Get the Windows major OS version. - * - * XXX - Should this return the minor version as well, e.g. 0x00050002? - * - * XXX - I think Microsoft have now stuck it at 6 forever, so it really - * distinguishes, on the versions of Windows we currently support and - * future Windows versions between Windows 2000/XP (major version 5) and - * everything after it (major version 6). - */ -guint32 -get_windows_major_version(void) -{ - OSVERSIONINFO info; - - info.dwOSVersionInfoSize = sizeof info; - if (GetVersionEx(&info)) { - return info.dwMajorVersion; - } - return 0; -} -#endif - /* * Editor modelines - http://www.wireshark.org/tools/modelines.html * diff --git a/wsutil/os_version_info.h b/wsutil/os_version_info.h index c9e14c337e..a56c132e4f 100644 --- a/wsutil/os_version_info.h +++ b/wsutil/os_version_info.h @@ -22,13 +22,6 @@ extern "C" { */ WS_DLL_PUBLIC void get_os_version_info(GString *str); -#ifdef _WIN32 -/* - * Get the Windows major OS version. - */ -WS_DLL_PUBLIC guint32 get_windows_major_version(void); -#endif - #ifdef __cplusplus } #endif /* __cplusplus */ |