C++ 为什么Windows 10内核32.dll上的GetFileVersionInfo返回版本6.2?

C++ 为什么Windows 10内核32.dll上的GetFileVersionInfo返回版本6.2?,c++,winapi,windows-10,kernel32,C++,Winapi,Windows 10,Kernel32,我试图检索kernel32.dllversion以执行Windows版本检查。然而,出于某种原因,即使kernel32.dll的版本(如文件属性中所示)是10.0.10586.0,返回的版本是:6.2.10586.0 为什么 DWORD dwDummy; DWORD dwFVISize = GetFileVersionInfoSize(lpszFilePath, &dwDummy); LPBYTE lpVersionInfo = new BYTE[dwFVISiz

我试图检索
kernel32.dll
version以执行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中的相同):

您从该任务的版本信息中读取了错误的字段。使用
dwProductVersionMS
dwProductVersionLS
代替
dwFileVersionMS
dwProductVersionLS

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

未针对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文档(即使文件版本与产品版本相同,它是否相关?我现在正在尝试。当我运行你的代码时,它的结果是6.2,但当你使用正确的字段时,它的结果是10.0。@RbMm我根本不理解这个注释。你明白为什么人们会检查系统DLL的产品版本吗?我认为也许你应该向询问者询问,而不是对我的答案发表评论,毕竟我的答案只是回答了被问到的问题。记住要提到的是,
RtlGetNtVersionNumbers
是一个未记录的API,在未来的版本中可能不存在。还请注意,询问者正在执行MS建议的操作:即:要获取操作系统的完整版本号,请在一个系统dll(如Kernel32.dll)上调用GetFileVersionInfo函数,然后调用VerQueryValue以获取文件版本信息的\\StringFileInfo\\\\ProductVersion子块。最后,我不认为这段代码真的会成为性能瓶颈。请将您的应用程序构建为64位可执行文件,然后查看是否得到相同的结果。有关替代方法,请参阅。@RbMm:
RtlGetNtVersionNumbers
未记录。它不是公共编程接口的一部分,在未来版本的操作系统中可能不可用。为什么不推荐呢?至少这是有文档记录的(即使将来的操作系统可能不支持从用户模式调用内核模式例程)。@RbMm:编程与统计无关。仅仅因为API没有在中更改,并不意味着它不会在中消失。更好的性能永远不是忽略文档化API的有效理由。如果您不关心正确性,那么就很容易提高性能(完全忽略调用)。如果
VerQueryValue
失败,由于在释放
lpVersionInfo
之前提前返回,此代码将泄漏内存。其实没什么大不了的,只是想指出一点。你使用的调试器是哪一个?你也能写下你完成的步骤吗?@SahilSingh-我自己的。