windows版本号的获取

windows版本号概览:

windows版本号的获取_第1张图片



一、 GetVersionEx

windows版本号的获取_第2张图片

  这种方法,在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 的主版本号

windows版本号的获取_第3张图片

  这种方法一般系统行得通的,但不能保证百分之百的正确,下面的win10系统,kernel32.dll的版本号仍然是6.1.


      windows版本号的获取_第4张图片



三、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. 使用

windows版本号的获取_第5张图片


这样得到的版本号都是系统真实对应的。



参考:

1.http://www.jkeabc.com/p/706538.html

typedef LONG( NTAPI* fnRtlGetVersion )(PRTL_OSVERSIONINFOW lpVersionInformation);

你可能感兴趣的:(windows版本号的获取)