diff --git a/src/xpdev/genwrap.c b/src/xpdev/genwrap.c index 5dc6d39c7d845db416cd8869573c9e2f3379e448..e8143543268248b929c575fb3cdde6d20d267a88 100644 --- a/src/xpdev/genwrap.c +++ b/src/xpdev/genwrap.c @@ -782,10 +782,22 @@ char* os_version(char *str, size_t size) /* Windows Version */ char* winflavor=""; OSVERSIONINFO winver; + static NTSTATUS (WINAPI *pRtlGetVersion)(PRTL_OSVERSIONINFOW lpVersionInformation) = NULL; winver.dwOSVersionInfoSize=sizeof(winver); #pragma warning(suppress : 4996) - GetVersionEx(&winver); + + if(pRtlGetVersion == NULL) { + HINSTANCE ntdll = LoadLibrary("ntdll.dll"); + if(ntdll != NULL) { + pRtlGetVersion = (NTSTATUS (WINAPI *)(PRTL_OSVERSIONINFOW))GetProcAddress(ntdll, "RtlGetVersion"); + FreeLibrary(ntdll); + } + } + if(pRtlGetVersion == NULL) + GetVersionEx(&winver); + else + pRtlGetVersion((PRTL_OSVERSIONINFOW)&winver); switch(winver.dwPlatformId) { case VER_PLATFORM_WIN32_NT: @@ -799,8 +811,12 @@ char* os_version(char *str, size_t size) break; } - /* Work-around Microsoft Windows 8.1 stupidity where GetVersionEx() lies about the current OS version */ - if(winver.dwMajorVersion == 6 && winver.dwMinorVersion == 2) { + if(winver.dwMajorVersion == 10 && winver.dwMinorVersion == 0) { + if(winver.dwBuildNumber >= 22000) + winver.dwMajorVersion = 11; + } + else if(winver.dwMajorVersion == 6 && winver.dwMinorVersion == 2) { + /* Work-around Microsoft Windows 8.1 stupidity where GetVersionEx() lies about the current OS version */ WKSTA_INFO_100* wksta_info; if(NetWkstaGetInfo(NULL, 100, (LPBYTE*)&wksta_info) == NERR_Success) { winver.dwMajorVersion = wksta_info->wki100_ver_major;