作为新手,对获取操作系统版本号好奇过,因为曾经假象过一个场景:自己的程序在windows xp环境下编译,在windows 2003,

windows 7,windows 8是否需要提权或者兼容处理,如果程序在windows 7以上版本需要特殊处理又该怎样判断操作系统版本呢。

带着这个好奇也了解过GetVersionGetVersionEx函数,他们的最低使用需求是Windows 2000,以下是一些官方的测试代码。

GetVersion function

#include <windows.h>
#include <stdio.h> void main()
{
DWORD dwVersion = ;
DWORD dwMajorVersion = ;
DWORD dwMinorVersion = ;
DWORD dwBuild = ; dwVersion = GetVersion(); // Get the Windows version. dwMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
dwMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion))); // Get the build number. if (dwVersion < 0x80000000)
dwBuild = (DWORD)(HIWORD(dwVersion)); printf("Version is %d.%d (%d)\n",
dwMajorVersion,
dwMinorVersion,
dwBuild);
}

运行结果:

Version is 5.1 (2600)

GetVersionEx function

#include <windows.h>
#include <stdio.h> void main()
{
OSVERSIONINFO osvi;
BOOL bIsWindowsXPorLater; ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&osvi); bIsWindowsXPorLater =
( (osvi.dwMajorVersion > ) ||
( (osvi.dwMajorVersion == ) && (osvi.dwMinorVersion >= ) )); if(bIsWindowsXPorLater)
printf("The system meets the requirements.\n");
else printf("The system does not meet the requirements.\n");
}

运行结果:

The system meets the requirements.

今天偶然看见一个帖子(GetVersionEx 如何区分win8和win8.1)和博客(Windows系统版本判定那些事儿)介绍这两个函数,说是在判断 Win8和Win8.1的时候有问题,可以正常返回值:

对于一个未加特殊处理的应用程序用GetVersionEx获取win8和win8.1系统版本,一律都是6.2

这是多么的坑人啊,令人敬畏。

从以上内容了解到了一个ntdll未公开的函数RtlGetNtVersionNumbers,了解到这个函数以后,我用工具查看了ntdll.dll导出函数,的确还真有这个呢。

查看导出函数可以用exescope/pexplorer/CFF explorer,选择导出-->ntdll.dll/导出表查看器/导出目录就可以找到导出地址了。

网友公布的函数使用方法我也在本地编译了一次

#include <stdio.h>
#include <windows.h> typedef void (__stdcall *NTPROC)(DWORD*,DWORD*,DWORD*); void GetWinVer()
{
HINSTANCE hinst = LoadLibrary("ntdll.dll");
DWORD dwMajor,dwMinor,dwBuildNumber;
NTPROC proc = (NTPROC)GetProcAddress(hinst,"RtlGetNtVersionNumbers");
proc(&dwMajor,&dwMinor,&dwBuildNumber);
dwBuildNumber&=0xffff;
printf("OS:%d.%d.%d\n",dwMajor,dwMinor,dwBuildNumber);
FreeLibrary(hinst);
} void main(void)
{
GetWinVer();
}

运行结果:

OS:5.1.2600

这与我在命令提示符下运行ver结果一样的

ver
Microsoft Windows XP [版本 5.1.2600]

这个函数能够准确的获取版本号,在实际运用中根据自己的需求决定吧

NTDLL未文档化函数RtlGetNtVersionNumbers获取操作系统版本的更多相关文章

  1. 利用未文档化API:RtlGetNtVersionNumbers 获取系统版本号

    问题一:Windows SDK 8.1版本中的VersionHelper.h文件当中没有IsWindows10ORGreater,所以当你用IsWindows8Point1ORGreater判断出版本 ...

  2. 利用未文档化API:RtlAdjustPrivilege 提权实现自动关机

    这里主要是利用NTDLL.dll中未文档化的API: RtlAdjustPrivilege 来实现提权.自动关机的功能. RtlAdjustPrivilege定义如下: NTSTATUS RtlAdj ...

  3. 使用Xcode HeaderDoc和Doxygen文档化你的Objective-C和Swift代码

    在一个应用的整个开发过程中涉及到了无数的步骤.其中一些是应用的说明,图片的创作,应用的实现,和实现过后的测试阶段.写代码可能组成了这个过程的绝大部分,因为正是它给了应用生命,但是这样还不够,与它同等重 ...

  4. Effective Java 第三版——74. 文档化每个方法抛出的所有异常

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...

  5. 使用 Swagger 文档化和定义 RESTful API

    大部分 Web 应用程序都支持 RESTful API,但不同于 SOAP API——REST API 依赖于 HTTP 方法,缺少与 Web 服务描述语言(Web Services Descript ...

  6. JQuery语法 JQuery对象与原生对象互转 文档就绪函数与window.onload的区别

    [JQuery语法] 1.jQuery("选择器").action();通过选择器调用事件函数,但是jquery中,jquery可以用$(“选择器”).action();   ① ...

  7. sphinx-python文档化

    概述 下文讲述使用sphinx自动生成reStructuredText python API文档的简单过程. 配置流程 安装依赖 $ pip install sphinx blurb python-d ...

  8. tbls ci 友好的数据库文档化工具

    tbls 是用golang 编写的数据库文档化工具,当前支持的数据库有pg.mysql.bigquery 此工具同时提供了变更对比.lint 校验,生成是markdown格式的 简单使用 安装 mac ...

  9. 使用.NET 6开发TodoList应用(27)——实现API的Swagger文档化

    系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 在日常开发中,我们需要给前端提供文档化的API接口定义,甚至需要模拟架设一个fake服务用来调试接口字段.或者对于后端开发人员 ...

随机推荐

  1. 移动端WEB页面

    百度前端技术学院第一阶段任务十一,关于移动端WEB页面布局,参考资料如下(都是一些网页链接): MDN:手机网页开发 MDN:在移动浏览器中使用viewport元标签控制布局 移动前端开发和 Web ...

  2. URL特殊字符的转义

    + 转义符为 %2B 空格 转义符为 + 或 %20 / 转义符为 %2F ? 转义符为 %3F % 转义符为 %25 # 转义符为 %23 & 转义符为 %26 = 转义符为 %3D

  3. nvm

    nvm install stable #安装最新稳定版 node,现在是 5.0.0 nvm install 4.2.2 #安装 4.2.2 版本 nvm install 0.12.7 #安装 0.1 ...

  4. jquery 获取鼠标和元素的坐标点

    获取当前鼠标相对img元素的坐标 $('img').mousemove(function(e) { varpositionX=e.pageX-$(this).offset().left; //获取当前 ...

  5. Javascript BOM对象

    BOM是browser object model的缩写,简称浏览器对象模型. window对象(BOM的核心对象) 表示浏览器的一个实例,在浏览器中,window对象有着双重角色,它既是通过Javas ...

  6. 网页手机wap2.0网页的head里加入下面这条元标签......

    网页手机wap2.0网页的head里加入下面这条元标签,在iPhone的浏览器中页面将以原始大小显示,并不允许缩放. <meta name="viewport" conten ...

  7. 把解压缩版的tomcat6注册成服务并设置自启动

    操作步骤: 1.在“开始 ”→“运行 ”中输入cmd 命令,进入MS-DOS界面 2.cd 到tomcat的bin目录下       C:/> cd tomcat/bin 3.运行命令servi ...

  8. 施耐德Sepam 40系列备自投逻辑

    1# 主供: VL1= NOT PVTS_1_3 V1 = VL1 AND P59_1_7 AND P59_1_8 AND P59_1_9VL2 = VL1 AND I12 AND I21 AND I ...

  9. JOST数据 日期转换

    开发中有时候需要从服务器端返回json格式的数据,在后台代码中如果有DateTime类型的数据使用系统自带的工具类序列化后将得到一个很长的数字表示日期数据,如下所示: 复制代码代码如下: //设置服务 ...

  10. zend framework2 下载及安装

    1.安装XAMPP 2.安装zend studio 3.在GITHUB上下载一个zendframework模板,插入到IDE中 4.将下载的zend framework2文件夹解压放在vendor文件 ...