当前位置: 首页 > 编程语言 > C#

取回Windows版本“1511”分享

时间:2023-04-10 20:44:25 C#

取回Windows版本“1511”查看“关于Windows”(开始>Run>winver)使用适当显示的控制台应用程序,从System.Environment.OSVersion.Version返回的Windows版本为10.0.10586.0,其中既不包含winver报告的版本的“1511”或“.3”组件。在HKLMSOFTWAREMicrosoftWindowsNTCurrentVersion下的注册表中似乎有一个字符串,例如ReleaseId,它将提供此信息,但这将取决于实现细节而不是API合同。简而言之,是否有提供Windows10版本的(已记录的)API,如winver和/或帮助>关于中所示,Windows组件(如记事本)可以从.net应用程序调用?这里有一些间接证据表明没有API可以获取“1511”字符串(除了从“ReleaseId”注册表值中读取它之外)。这不是一个绝对的证据,它可能不是你想要的答案,但这就是我现在所拥有的。使用sysinternals的ProcMon记录“winver”运行表明注册表项确实已被查询,正如@S?renKuklau已经指出的那样。winver.exeRegQueryValueHKLMSOFTWAREMicrosoftWindowsNTCurrentVersionReleaseIDSUCCESS类型:REG_SZ,长度:10,数据:1511根据ProcMon的报告,“ReleaseID”的RegQueryValueExW调用堆栈如下所示。0ntoskrnl.exeNtQueryInformationFile+0x3d501ntoskrnl.exeNtOpenThreadTokenEx+0x258c2ntoskrnl.exesetjmpex+0x39633ntdll.dllZwQueryValueKey+0x144KernelBase.dllMapPredefinedHandleInternal+0x7295KernelBase.dllRegQueryValueExW+0xed6SHCore.dllSHQueryValueExW+0xdd7SHCore.dllSHQueryValueExW+0x328shell32.dllOrdinal897+0x86f9shell32.dllOrdinal897+0xb8b10shell32.dllOrdinal897+0x30411user32.dllIsDialogMessageW+0x76e12user32.dllIsDialogMessageW+0x94113user32.dllIsDialogMessageW+0x86614user32.dllDispatchMessageW+0x68915user32.dllSendMessageW+0x39516user32.dllSetWindowLongPtrA+0x97917user32.dllDialogBoxIndirectParamAorW+0x18c18user32.dllDialogBoxIndirectParamAorW+0x5219user32.dllDialogBoxParamW+0x8520shell32.dllSHELL32_PifMgr_OpenProperties+0x223d21shell32.dllShellAboutW+0x7222winver.exewinver.exe+0x11d323winver.exewinver.exe+0x151624kernel32.dllBaseThreadInitThunk+0x2225ntdll.dllRtlUserThreadStart+0x34因此winver.exe从shell32.dll调用ShellAboutW,它打开对话框并用数据填充它这样做时,它读取“HKLMSOFTWAREMicrosoftWindowsNTCurrentVersionReleaseID”注册表值,返回“1511”。值“ReleaseID”确实在shell32.dll中作为硬编码字符串被发现。此外,唯一具有“ReleaseId”字符串的其他System32DLL是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(LPTSTRlpRellD,intnMaxChars)”;它也可能按名称而不是序号导出,并记录在未来的SDK中。然而,目前这些是序号导出的匿名函数,没有文档,甚至无法保证下次更新shell32.dll时它们的顺序相同。FWIW,ProcessMonitor建议winver只查询ReleaseId。所以也许这就是“Edition1511”品牌的全部意义所在。23:59:30,6022870winver.exe7004RegQueryValueHKLMSOFTWAREMicrosoftWindowsNTCurrentVersionReleaseIDSUCCESS类型:REG_SZ,长度:10,数据:1511再次启动winver时,将注册表值更改为随机值会立即反映出来。删除该值会使winver显示一个空字符串。因此,虽然没有很好地封装在API中并且可能不受支持,但现在这似乎可以解决问题:了解有关C#学习教程的更多信息,希望您多加注意——使用(varhklmKey=Microsoft.Win32.Registry.LocalMachine)使用(varsubKey=hklmKey.OpenSubKey(@"SOFTWAREMicrosoftWindowsNTCurrentVersion")){if(subKey!=null){stringrelease=subKey.GetValue("ReleaseId")asstring;if(release!=null)retVal+="Version"+release;}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理会员删除。如需转载请注明出处: