原创文章, 转载必须保留出处!!
内核获取版本号一般都是调用 RtlGetVersion
(1) <win10(20h1): 无论啥时候调用返回的BuildNum都是固定,
(2) >= win10(20h1): 如果驱动是start= 1的方式启动的, 那么在启动时, 跟系统完全启动后再读取到的版本号可能是不一致的, 因为从这个版本开始系统对这个build number的实现方式发生了改变
以下仅粗略讨论变化之处
系统内核用一个全局变量表示这个build number -->NtBuildNumber, RtlGetVersion返回的就是这个全局变量的值.
最开始有一个初始值, 然后一个内核函数从注册表一个位置读取了build number, 把NtBuildNumber的现有值给覆盖了,
然后再把所有版本号相关的所有值写入HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion下面
win10 跟win11读取的注册表的位置略有不同, 读取的函数也略有区别
系统 | 内核函数 | 读取的注册表位置 |
win10 | CmpSetVersionData | HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\EditionVersion |
win11 | CmpLoadSystemVersionData | HKEY_LOCAL_MACHINE\SYSTEM\Software\Microsoft\BUILDLAYERS |
不太清楚微软为什么这么搞, 成天在这瞎折腾