Windows 10的最新版本(目前是内幕预览版)被标记为:
版本1511 (OS Build 10586.3)
查看“关于Windows”时( Start > Run > winver )
使用适当表现控制台应用程序,System.Environment.OSVersion.Version返回的Windows为10.0.10586.0,该版本既不包含winver报告的版本的"1511“组件,也不包含".3”组件。
在HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion下的注册表中确实有字符串,比如ReleaseId,它将提供这些信息,但是这将依赖于实现细节,而不是API契约。
简而言之,是否有(有文档记录的) API提供winver和/或Help >API组件中所显示的Windows 10版本,例如可从.net应用程序调用的记事本?
发布于 2015-11-14 03:51:48
以下是一些间接证据,表明没有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: 1511RegQueryValueExW中"ReleaseID“点处的调用堆栈如下所示,由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从fills 32.dll调用ShellAboutW,后者打开对话框并填充数据。这样做时,它读取"HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ReleaseID“注册表值,返回"1511”。
在string 32.dll中,值名"ReleaseID“确实是一个硬编码字符串。此外,唯一带有"ReleaseId“字符串的其他ReleaseID DLL是SettingsHandlers_nt.dll和WSShared.dll --但它们都不是由winver.exe加载的,而且它们对于"ReleaseID”都有不同的大写化(首先是小写的"d“)。这有力地表明:
(a)传入RegQueryValueExW的字符串是string 32.dll中硬编码的字符串;
(b)其他MS代码具有类似的硬编码字符串,大概是因为没有API来获得它。
这仍然打开了一个可能性,即相同的"1511“信息(或至少是"ReleaseID”值)可以通过其他API由still 32.dll公开。例如,调用堆栈中一个位于偏移量8、9、10的"Ordinal897“调用可能实际上是一个类似于"GetWin10RelID(LPTSTR lpRellD,int nMaxChars)”的函数;它也可能以名称而不是序号导出,并在未来的SDK中被记录下来。但是,暂时而言,这些都是由序号导出的匿名函数,没有文档,也不能保证下次更新those 32.dll时它们会保持相同的序号。
发布于 2015-11-11 23:03:17
FWIW,Process建议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;
}
}https://stackoverflow.com/questions/33641076
复制相似问题