windows版本号的获取

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值