Replace deprecated WINAPI GetVersionInfoEx (#6496)
authoradrido <robots_only_adrido@gmx.com>
Sat, 7 Oct 2017 13:13:13 +0000 (15:13 +0200)
committerSmallJoker <mk939@ymail.com>
Sun, 3 Jun 2018 15:31:59 +0000 (17:31 +0200)
* Replace deprecated WINAPI GetVersionInfoEx

src/CMakeLists.txt
src/porting.cpp

index 7c1a4eee0959b1ba92393b3c27d3b59cdfc19be9..b1650f376c3dadc44e58952a57c398ea59f130cd 100644 (file)
@@ -268,7 +268,7 @@ if(WIN32)
        else() # Probably MinGW = GCC
                set(PLATFORM_LIBS "")
        endif()
-       set(PLATFORM_LIBS ws2_32.lib shlwapi.lib ${PLATFORM_LIBS})
+       set(PLATFORM_LIBS ws2_32.lib version.lib shlwapi.lib ${PLATFORM_LIBS})
 
        # Zlib stuff
        set(ZLIB_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/../../zlib/zlib-1.2.5"
index 10b6fc94059c675af85165b669e65518bd606611..0a9de2a593b0f6684ff1325fcf773feb0efc6d54 100644 (file)
@@ -32,6 +32,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
        #include <windows.h>
        #include <wincrypt.h>
        #include <algorithm>
+       #include <shlwapi.h>
 #endif
 #if !defined(_WIN32)
        #include <unistd.h>
@@ -181,20 +182,26 @@ bool detectMSVCBuildDir(const std::string &path)
 std::string get_sysinfo()
 {
 #ifdef _WIN32
-       OSVERSIONINFO osvi;
+
        std::ostringstream oss;
-       std::string tmp;
-       ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
-       osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
-       GetVersionEx(&osvi);
-       tmp = osvi.szCSDVersion;
-       std::replace(tmp.begin(), tmp.end(), ' ', '_');
-
-       oss << "Windows/" << osvi.dwMajorVersion << "."
-               << osvi.dwMinorVersion;
-       if (osvi.szCSDVersion[0])
-               oss << "-" << tmp;
-       oss << " ";
+       LPSTR filePath = new char[MAX_PATH];
+       UINT blockSize;
+       VS_FIXEDFILEINFO *fixedFileInfo;
+
+       GetSystemDirectoryA(filePath, MAX_PATH);
+       PathAppendA(filePath, "kernel32.dll");
+
+       DWORD dwVersionSize = GetFileVersionInfoSizeA(filePath, NULL);
+       LPBYTE lpVersionInfo = new BYTE[dwVersionSize];
+
+       GetFileVersionInfoA(filePath, 0, dwVersionSize, lpVersionInfo);
+       VerQueryValueA(lpVersionInfo, "\\", (LPVOID *)&fixedFileInfo, &blockSize);
+
+       oss << "Windows/"
+               << HIWORD(fixedFileInfo->dwProductVersionMS) << '.' // Major
+               << LOWORD(fixedFileInfo->dwProductVersionMS) << '.' // Minor
+               << HIWORD(fixedFileInfo->dwProductVersionLS) << ' '; // Build
+
        #ifdef _WIN64
        oss << "x86_64";
        #else
@@ -205,6 +212,9 @@ std::string get_sysinfo()
                oss << "x86";
        #endif
 
+       delete[] lpVersionInfo;
+       delete[] filePath;
+
        return oss.str();
 #else
        struct utsname osinfo;