博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
windows版本号的获取
阅读量:4107 次
发布时间:2019-05-25

本文共 905 字,大约阅读时间需要 3 分钟。

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.

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

你可能感兴趣的文章
【转载】如何用C语言封装 C++的类,在 C里面使用
查看>>
剖析Linux系统中硬链接与软链接的区别
查看>>
解压命令
查看>>
linux之cp/scp命令
查看>>
scanf返回值
查看>>
函数指针和指针函数
查看>>
C语言struct复制问题
查看>>
分布式文件系统
查看>>
GDB 命令详细解释
查看>>
分布式系统的数据结构
查看>>
vimrc配置(每次找都很麻烦)
查看>>
Sprite缓存策略总结
查看>>
Ramdisk的使用
查看>>
gcc -l参数和-L参数
查看>>
GCC 提供的原子操作
查看>>
谷歌打印html界面布局方法(当一页展示不完的情况下,在新的页面展示)
查看>>
从0开始的java开发环境搭建(2020版)
查看>>
学习笔记之jquery
查看>>
eclipse启动tomcat无法访问
查看>>
jquery,mysql随记
查看>>