首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检索Windows版本"1511“

检索Windows版本"1511“
EN

Stack Overflow用户
提问于 2015-11-10 22:44:06
回答 2查看 2.6K关注 0票数 3

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应用程序调用的记事本?

EN

回答 2

Stack Overflow用户

发布于 2015-11-14 03:51:48

以下是一些间接证据,表明没有API可以获取"1511“字符串(除了从"ReleaseId”注册表值中读取它之外)。这不是一个绝对的证据,也可能不是你想要的答案,但这正是我现在所拥有的。

使用sysinternals的ProcMon记录"winver“运行显示,注册表项确实是被查询的,就像@S ren Kuklau已经指出的那样。

代码语言:javascript
复制
winver.exe RegQueryValue HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ReleaseID SUCCESS Type: REG_SZ, Length: 10, Data: 1511

RegQueryValueExW中"ReleaseID“点处的调用堆栈如下所示,由ProcMon报告。

代码语言:javascript
复制
 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时它们会保持相同的序号。

票数 8
EN

Stack Overflow用户

发布于 2015-11-11 23:03:17

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

代码语言:javascript
复制
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中,而且可能不受支持,但目前看来,这似乎起到了作用:

代码语言:javascript
复制
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;
     }
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33641076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档