windows版本号概览:
一、 GetVersionEx
这种方法,在windows 8之前都是没有问题的,但是win8后就有问题。Win8下面运行正常的显示为6.2.9200
, 但是接下来在Win8.1下面测试尽然还是6.2.9200。经过查证,
实际上这个问题并非bug,而是微软有意为之。如果程序的目标运行平台不需要支持Win8.1,那么GetVersion(Ex)就给你返回6.2,除非通过App manifests方式指定程序支持Win8.1系统。
在Win8.1系统以后GetVersion(Ex)被放到兼容层(shim)里面,这样GetVersion(Ex)并不一定会返回系统真实的版本号。取而代之可以采用VersionHelpers方式获取真实的系统版本号。
二、直接获取 kernel32.dll 的主版本号
这种方法一般系统行得通的,但不能保证百分之百的正确,下面的win10系统,kernel32.dll的版本号仍然是6.1.
三、VersionHelpers
VersionHelpers不是所有的系统都有,需要安装SDK 8.1或者SDK10.
这种方式存在几个问题:
(1) 只有判断版本大于等于某个版本号的接口,无法一次性的得到版本号。
(2)SDK 8.1中只存在 IsWindows8Point1OrGreater,也就是只能判断到是否大于等于8.1,到底是8.1还是10,无法确定。SDK 1 0中才有IsWindows10OrGreater。这样扩展性很差,以后再出个win11,又得重新下载SDK,修改代码。
四、RtlGetVersion
这个API SDK没有导出,所以需要动态获取,其实VersionHelpers里也是这么实现的。
1. 定义函数原型
生成时,始终出现以下错误
没办法,把NTSTATUS直接改成LONG,生成OK.
2. 使用
这样得到的版本号都是系统真实对应的。
参考:
1.http://www.jkeabc.com/p/706538.html
typedef LONG( NTAPI* fnRtlGetVersion )(PRTL_OSVERSIONINFOW lpVersionInformation);