为什么 GetFileVersionInfo on kernel32.dll in Windows 10 return 版本 6.2?

Why does GetFileVersionInfo on kernel32.dll in Windows 10 return version 6.2?

我正在尝试检索 kernel32.dll 版本以执行 Windows 版本检查。然而,出于某种原因,即使 kernel32.dll 的版本(在文件属性中看到)是 10.0.10586.0,返回的版本是:6.2.10586.0 怎么会?

    DWORD dwDummy;
    DWORD dwFVISize = GetFileVersionInfoSize(lpszFilePath, &dwDummy);
    LPBYTE lpVersionInfo = new BYTE[dwFVISize];
    if (GetFileVersionInfo(lpszFilePath, 0, dwFVISize, lpVersionInfo) == 0)
    {
        return FALSE;
    }

    UINT uLen;
    VS_FIXEDFILEINFO *lpFfi;
    BOOL bVer = VerQueryValue(lpVersionInfo, L"\", (LPVOID *)&lpFfi, &uLen);

    if (!bVer || uLen == 0)
    {
        return FALSE;
    }
    DWORD dwFileVersionMS = lpFfi->dwFileVersionMS;
    DWORD dwFileVersionLS = lpFfi->dwFileVersionLS;
    delete[] lpVersionInfo;

    DWORD dwLeftMost = HIWORD(dwFileVersionMS);
    DWORD dwSecondLeft = LOWORD(dwFileVersionMS);
    DWORD dwSecondRight = HIWORD(dwFileVersionLS);
    DWORD dwRightMost = LOWORD(dwFileVersionLS);

Kernel32.dll 属性(与 SysWow64 中相同):

您正在从该任务的版本信息中读取错误的字段。而不是 dwFileVersionMSdwFileVersionLS 使用 dwProductVersionMSdwProductVersionLS.

文件版本字段存在 supportedOS 兼容性问题。也就是说,它们的值取决于应用程序清单中声明的​​ supportedOS 级别。另一方面,产品版本字段不依赖于清单。

Applications not manifested for Windows 8.1 or Windows 10 will return the Windows 8 OS version value (6.2).

这是来自 GetVersionEx 函数的 MSDN 描述。对于 GetFileVersionInfo 没有这样的说明,但实际上这样做是一样的。我在调试器下查看:

所以 dwFileVersionMS 中的 10.0 ( 0xA000) 可以固定为 6.2 或 6.3 但 dwProductVersionMS - 未更改 (0xA000 ~ 10.0) 认为需要修复 GetFileVersionInfo[Ex] 的 MSDN 文档 :)