NTDLL未文檔化函數RtlGetNtVersionNumbers獲取操做系統版本

做爲新手,對獲取操做系統版本號好奇過,由於曾經假象過一個場景:本身的程序在windows xp環境下編譯,在windows 2003,windows

windows 7,windows 8是否須要提權或者兼容處理,若是程序在windows 7以上版本須要特殊處理又該怎樣判斷操做系統版本呢。函數

帶着這個好奇也瞭解過GetVersionGetVersionEx函數,他們的最低使用需求是Windows 2000,如下是一些官方的測試代碼。工具

GetVersion function

#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

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 > 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]

這個函數可以準確的獲取版本號,在實際運用中根據本身的需求決定吧

相關文章
相關標籤/搜索