以下是一些间接证据,表明除了从“ReleaseId”注册表值中读取之外,没有API可以获取“1511”字符串。这不是绝对的证据,可能不是您寻求的答案,但这是我目前所拥有的。
使用sysinternals的ProcMon记录“winver”运行情况显示,确实查询了注册表键,正如@Sören Kuklau已经指出的那样。
winver.exe RegQueryValue HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ReleaseID SUCCESS Type: REG_SZ, Length: 10, Data: 1511
在执行RegQueryValueExW函数查询“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从shell32.dll调用ShellAboutW,打开对话框并填写数据。在此过程中,它读取“HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ ReleaseID”注册表值,返回“1511”。确实可以在shell32.dll中找到"ReleaseID"的值名称作为硬编码字符串。此外,唯一其他带有“ReleaseId”字符串的System32 DLL是SettingsHandlers_nt.dll和WSShared.dll,但winver.exe没有加载其中任何一个,并且两者都具有不同的大小写形式(其中一个以小写“d”结尾)。这强烈暗示:
(a)传递到RegQueryValueExW中的字符串是在shell32.dll中硬编码的字符串;
(b)其他Microsoft代码也有相似的字符串硬编码,可能是因为没有API来获取它。
这仍然保留了通过 shell32.dll 的其他 API 可能公开相同的 “1511” 信息(或至少 “ReleaseID” 值名称)的可能性。例如,偏移量为 8、9、10 的“Ordinal897”调用中的其中一个可能实际上是像 “GetWin10RelID(LPTSTR lpRellD, int nMaxChars);” 这样的函数,还可能通过名称导出,并在未来的 SDK 中得到记录。然而,目前这些都是通过序数导出的匿名函数,没有文档说明,并且不能保证下次更新 shell32.dll 时它们甚至会保持相同的顺序。