为什么Windows 10中的kernel32.dll上的GetFileVersionInfo返回版本6.2?

Ran*_*anH 4 c++ winapi kernel32 windows-10

使用以下代码,我试图检索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);
Run Code Online (Sandbox Code Playgroud)

Kernel32.dll属性(与SysWow64中的相同): 在此输入图像描述

Dav*_*nan 6

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

文件版本字段受supportedOS兼容性问题的影响.这是它们的值取决于supportedOS应用程序清单中声明的级别.另一方面,产品版本字段不依赖于清单.

  • 我想也许你应该对提问者采取这种做法,而不是评论我的回答,这毕竟只是解决了被问到的问题.请记住,`RtlGetNtVersionNumbers`是一个未记录的API,可能在将来的版本中不存在.另请注意,提问者正在做MS建议:https://msdn.microsoft.com/en-us/library/windows/desktop/ms724429(v = vs.85).aspx (3认同)
  • 其中说:*要获取操作系统的完整版本号,请在其中一个系统DLL(如Kernel32.dll)上调用GetFileVersionInfo函数,然后调用VerQueryValue以获取\\ StringFileInfo \\ <lang> <codepage>\\ ProductVersion子块的文件版本信息.*最后,我不认为这段代码真的会成为性能瓶颈. (2认同)

RbM*_*bMm 6

未针对 Windows 8.1 或 Windows 10 显示的应用程序将返回 Windows 8 操作系统版本值 (6.2)。

这是来自 GetVersionEx 函数 MSDN 的描述。对于 GetFileVersionInfo 没有这样的注释,但实际上这样做是一样的。我在调试器下查看: 在此输入图像描述

在此输入图像描述

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