列举了一些目前所知道的方法来获取Windows操作系统版本号
- 方法1 RtlGetNtVersionNumbers
| 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);
|
| DWORD dwVersion= GetVersion();
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");
|
| BOOL GetVersionEx(POSVERSIONINFO pVersionInformation); typedef struct { DWORD dwOSVersionInfoSize; 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> <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/> <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/> </application> </compatibility> </assembly>
|
- 法4 PsGetVersion,在内核驱动程序中调用该函数
| BOOLEAN PsGetVersion( PULONG MajorVersion OPTIONAL, PULONG MinorVersion OPTIONAL, PULONG BuildNumber OPTIONAL, PUNICODE_STRING CSDVersion OPTIONAL ); MajorVersion 是主版本号 MinorVersion 是副版本号 BuildNumber 是build版本号,如7600等 CSDVersion 存放着SP1、SP2等信息
|