【问题标题】:Retrieving Windows version "1511"检索 Windows 版本“1511”
【发布时间】:2015-11-10 22:44:06
【问题描述】:

最新版本的 Windows 10(目前为 Insider Preview)标记为:

版本 1511(操作系统内部版本 10586.3)

查看“关于 Windows”时(开始 > 运行 > winver

使用appropriately manifested 控制台应用程序,从System.Environment.OSVersion.Version 返回的Windows 版本为10.0.10586.0,其中不包含winver 报告的版本的“1511”或“.3”组件。

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion 下的注册表中似乎确实存在字符串,例如 ReleaseId,它们将提供此信息,但这将依赖于实现细节而不是 API 合同。

简而言之,是否有提供 Windows 10 版本的(记录在案的)API,如 winver 和/或帮助 > Windows 组件(例如可从 .net 应用程序调用的记事本)中的关于?

【问题讨论】:

  • "使用适当显示的控制台应用程序" 也许这不是 1511 的正确显示?可能会出现一个额外的受支持的操作系统 GUID。
  • 一般来说你不应该关心。就最终用户而言,它是“Windows 10”,就遥测/支持数据而言,它是 10.0.10586.0

标签: c# .net windows-10


【解决方案1】:

这里有一些间接证据表明没有 API 可以获取“1511”字符串(除了从“ReleaseId”注册表值中读取它)。这不是绝对的证明,也可能不是您所寻求的答案,但这就是我目前所拥有的。

使用 sysinternals 的 ProcMon 记录“winver”运行表明确实查询了注册表项,正如 @Sören Kuklau 已经指出的那样。

winver.exe RegQueryValue HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ReleaseID SUCCESS Type: REG_SZ, Length: 10, Data: 1511

“ReleaseID”的 RegQueryValueExW 点的调用堆栈如下,由 ProcMon 报告。

 0 ntoskrnl.exe   NtQueryInformationFile + 0x3d50
 1 ntoskrnl.exe   NtOpenThreadTokenEx + 0x258c
 2 ntoskrnl.exe   setjmpex + 0x3963
 3 ntdll.dll      ZwQueryValueKey + 0x14
 4 KernelBase.dll MapPredefinedHandleInternal + 0x729
 5 KernelBase.dll RegQueryValueExW + 0xed
 6 SHCore.dll     SHQueryValueExW + 0xdd
 7 SHCore.dll     SHQueryValueExW + 0x32
 8 shell32.dll    Ordinal897 + 0x86f
 9 shell32.dll    Ordinal897 + 0xb8b
10 shell32.dll    Ordinal897 + 0x304
11 user32.dll     IsDialogMessageW + 0x76e
12 user32.dll     IsDialogMessageW + 0x941
13 user32.dll     IsDialogMessageW + 0x866
14 user32.dll     DispatchMessageW + 0x689
15 user32.dll     SendMessageW + 0x395
16 user32.dll     SetWindowLongPtrA + 0x979
17 user32.dll     DialogBoxIndirectParamAorW + 0x18c
18 user32.dll     DialogBoxIndirectParamAorW + 0x52
19 user32.dll     DialogBoxParamW + 0x85
20 shell32.dll    SHELL32_PifMgr_OpenProperties + 0x223d
21 shell32.dll    ShellAboutW + 0x72
22 winver.exe     winver.exe + 0x11d3
23 winver.exe     winver.exe + 0x1516
24 kernel32.dll   BaseThreadInitThunk + 0x22
25 ntdll.dll      RtlUserThreadStart + 0x34

因此,winver.exe 从 shell32.dll 调用 ShellAboutW,这会打开对话框并填写数据。执行此操作时,它会读取“HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ReleaseID”注册表值,返回“1511”。

值名称“ReleaseID”确实在 shell32.dll 中作为硬编码字符串被发现。此外,唯一带有“ReleaseId”字符串的其他 System32 DLL 是 SettingsHandlers_nt.dll 和 WSShared.dll - 但它们都不是由 winver.exe 加载的,并且两者都有不同的“ReleaseID”大小写(小写“d”在末尾,一方面)。这强烈暗示:
(a) 传入 RegQueryValueExW 的字符串是 shell32.dll 中硬编码的字符串;
(b) 其他 MS 代码有类似的字符串硬编码,大概是因为没有 API 可以得到它。

这仍然保留了相同的“1511”信息(或至少“ReleaseID”值名称)可能由 shell32.dll 通过其他一些 API 公开的可能性。例如,调用堆栈中偏移量 8、9、10 处的“Ordinal897”调用之一实际上可能是像“GetWin10RelID(LPTSTR lpRellD, int nMaxChars);”这样的函数。并且它也有可能按名称而不是序号导出并记录在未来的 SDK 中。但是,暂时这些是序数导出的匿名函数,没有文档,也不能保证下次更新 shell32.dll 时它们甚至会保持相同的序数。

【讨论】:

  • releaseid 不再适用于 21h1,而是现在使用 displayversion。旧版本不存在
  • @az1d 很高兴知道,谢谢。您可以将其发布为答案。
【解决方案2】:

FWIW,Process Monitor 建议 winver 确实只是查询 ReleaseId。所以也许这就是“1511 版”品牌的全部内容。

23:59:30,6022870    winver.exe  7004    RegQueryValue   HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ReleaseID SUCCESS Type: REG_SZ, Length: 10, Data: 1511

将注册表值更改为随机值会在再次启动winver 时立即反映出来。删除该值会使winver 显示一个空字符串。

因此,虽然没有很好地包装在 API 中并且可能不受支持,但现在这似乎可以解决问题:

using (var hklmKey = Microsoft.Win32.Registry.LocalMachine)
using (var subKey = hklmKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion"))
{
     if (subKey != null)
     {
         string release = subKey.GetValue("ReleaseId") as string;

         if (release != null)
             retVal += " Version " + release;
     }
}

【讨论】:

  • 感谢您花时间了解 Process Manager 的情况(从而验证了我关于数据可能来自何处的理论)。我不会接受这一点,因为我的问题是针对此请求 API,尽管它是有价值的信息 =) 在 winver.exe 和它的 MUI 文件中运行 sysinternals "strings" 找不到对 "ReleaseId" 的引用,所以它看起来它可能正在调用 API...
  • releaseid 不再适用于 21h1,而是现在使用 displayversion。旧版本不存在
  • 该死的。为什么他们不断改变呢? (我还没有 21H1。但是,在 20H2 上,DisplayVersion 确实已经存在。不清楚是什么时候引入的。)
猜你喜欢
  • 2016-02-15
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
相关资源
最近更新 更多