WindowsAPI获取操作系统主次版本号

列举了一些目前所知道的方法来获取Windows操作系统版本号

  • 方法1 RtlGetNtVersionNumbers
1
2
3
4
5
6
7
8
9
10
//定义函数指针
typedef void(__stdcall*NTPROC)(DWORD*, DWORD*, DWORD*);
//载入模块
HMODULE hmod= LoadLibraryA("ntdll.dll");
//获取函数地址
NTPROC RtlGetNtVersionNumbers = (NTPROC)GetProcAddress(hmod, "RtlGetNtVersionNumbers");
DWORD dwMajor, dwMin, dwOpt;
RtlGetNtVersionNumbers(&dwMajor, &dwMin, &dwOpt);
//卸载模块
FreeLibrary(hmod);
  • 方法2 GetVersion
1
2
3
4
5
6
7
8
DWORD dwVersion= GetVersion();
//低16位
WORD lwo = LOWORD(dwVersion);
BYTE minor = HIBYTE(lwo); //次版本号
BYTE major = LOBYTE(lwo); //主版本号
if (major ==10) SetWindowText(L"Windows 10");
if (major ==6) SetWindowText(L"Windows 7");

  • 方法3 GetVersionEx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
BOOL GetVersionEx(POSVERSIONINFO pVersionInformation);

typedef struct {
DWORD dwOSVersionInfoSize; //在使用GetVersionEx之前要将此初始化为结构的大小
DWORD dwMajorVersion; //系统主版本号
DWORD dwMinorVersion; //系统次版本号
DWORD dwBuildNumber; //系统构建号
DWORD dwPlatformId; //系统支持的平台
TCHAR szCSDVersion[128]; //系统补丁包的名称
WORD wServicePackMajor; //系统补丁包的主版本
WORD wServicePackMinor; //系统补丁包的次版本
WORD wSuiteMask; //标识系统上的程序组
BYTE wProductType; //标识系统类型
BYTE wReserved; //保留,未使用
}OSVERSIONINFOEX, *POSVERSIONINFOEX;

注意,使用该函数在Windows8和Windows10之间获取的是同一个主次版本号,所以,要在项目添加一个清单文件(manifest)
配置属性->清单工具->输入和输出-附加清单文件,填写manifest.xml

manifest.xml文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="UTF-8"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!-- Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
</application>
</compatibility>
</assembly>
  • 法4 PsGetVersion,在内核驱动程序中调用该函数
1
2
3
4
5
6
7
8
9
10
BOOLEAN PsGetVersion(
PULONG MajorVersion OPTIONAL,
PULONG MinorVersion OPTIONAL,
PULONG BuildNumber OPTIONAL,
PUNICODE_STRING CSDVersion OPTIONAL
);
MajorVersion 是主版本号
MinorVersion 是副版本号
BuildNumber 是build版本号,如7600
CSDVersion 存放着SP1、SP2等信息

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!