做爲新手,對獲取操做系統版本號好奇過,由於曾經假象過一個場景:本身的程序在windows xp環境下編譯,在windows 2003,windows
windows 7,windows 8是否須要提權或者兼容處理,若是程序在windows 7以上版本須要特殊處理又該怎樣判斷操做系統版本呢。函數
帶着這個好奇也瞭解過GetVersion和GetVersionEx函數,他們的最低使用需求是Windows 2000,如下是一些官方的測試代碼。工具
#include <windows.h> #include <stdio.h> void main() { DWORD dwVersion = 0; DWORD dwMajorVersion = 0; DWORD dwMinorVersion = 0; DWORD dwBuild = 0; 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)ui
#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 > 5) || ( (osvi.dwMajorVersion == 5) && (osvi.dwMinorVersion >= 1) )); if(bIsWindowsXPorLater) printf("The system meets the requirements.\n"); else printf("The system does not meet the requirements.\n"); }
運行結果:spa
The system meets the requirements.操作系統
今天偶然看見一個帖子(GetVersionEx 如何區分win8和win8.1)和博客(Windows系統版本斷定那些事兒)介紹這兩個函數,說是在判斷 Win8和Win8.1的時候有問題,能夠正常返回值:.net
對於一個未加特殊處理的應用程序用GetVersionEx獲取win8和win8.1系統版本,一概都是6.2code
這是多麼的坑人啊,使人敬畏。blog
從以上內容瞭解到了一個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]
這個函數可以準確的獲取版本號,在實際運用中根據本身的需求決定吧