请问如何在Ring0下获取系统版本 例如我的电脑是XP SP3 那有什么NT API可以获取?

解决方案 »

  1.   

    推荐:
    http://www.cppblog.com/free2000fly/archive/2008/07/23/56904.html如何在驱动中取得 windows 的详细版本号
    之所以有此一问, 是因为不同版本的 Windows, 甚至同一版本的不同 SP, 其内核数据结构是不同的, 而开发驱动程序经常要直接操纵这些内核数据结构, 就必须得到 Windows 版本的详细信息.如何在内核里取得 windows 详细版本号始终是困扰驱动开发人的一个不大不小的问题, 因为 PsGetVersion 函数的最后一个参数根本就不起作用, 得不到 SP 版本号, 而 RtlGetVersion 函数是在 Windows XP 才提供的, 不具通用性.因此, 我写了一个函数, 将这两个函数封装在一起, 让其首先试图调用 RtlGetVersion 函数, 如果失败了, 表明这肯定是 Windows 2000 及以下系统, 目前我们一般只支持到 Windows 2000, 至于 undocumented 内核数据结构, Windows 2000 下的都是一样的, 所以就不做 sp 版本判断了.typedef enum WIN_VER_DETAIL {
        WINDOWS_VERSION_NONE,       //  0
        WINDOWS_VERSION_2K,
        WINDOWS_VERSION_XP,
        WINDOWS_VERSION_2K3,
        WINDOWS_VERSION_2K3_SP1_SP2,
        WINDOWS_VERSION_VISTA,
    } WIN_VER_DETAIL;typedef NTSTATUS (NTAPI * PFN_RtlGetVersion)(OUT PRTL_OSVERSIONINFOW lpVersionInformation);EXTERN_C WIN_VER_DETAIL GetWindowsVersion()
    {
        UNICODE_STRING ustrFuncName = { 0 };
        RTL_OSVERSIONINFOEXW osverinfo = { sizeof(osverinfo) };
        PFN_RtlGetVersion pfnRtlGetVersion = NULL;    RtlInitUnicodeString(&ustrFuncName, L"RtlGetVersion");
        pfnRtlGetVersion = MmGetSystemRoutineAddress(&ustrFuncName);    if (pfnRtlGetVersion)
        {
            kdprintf("[xxxxxxxx] Using \"RtlGetVersion\"\n");
            pfnRtlGetVersion((PRTL_OSVERSIONINFOW)&osverinfo);
        }
        else
        {
            kdprintf("[xxxxxxxx] Using \"PsGetVersion\"\n");
            PsGetVersion(&osverinfo.dwMajorVersion, &osverinfo.dwMinorVersion, &osverinfo.dwBuildNumber, NULL);
        }    kdprintf("[xxxxxxxx] OSVersion NT %d.%d:%d sp%d.%d\n",
            osverinfo.dwMajorVersion, osverinfo.dwMinorVersion, osverinfo.dwBuildNumber,
            osverinfo.wServicePackMajor, osverinfo.wServicePackMinor);    if (osverinfo.dwMajorVersion == 5 && osverinfo.dwMinorVersion == 0) {
            return WINDOWS_VERSION_2K;
        } else if (osverinfo.dwMajorVersion == 5 && osverinfo.dwMinorVersion == 1) {
            return WINDOWS_VERSION_XP;
        } else if (osverinfo.dwMajorVersion == 5 && osverinfo.dwMinorVersion == 2) {
            if (osverinfo.wServicePackMajor==0) {
                return WINDOWS_VERSION_2K3;
            } else {
                return WINDOWS_VERSION_2K3_SP1_SP2;
            }
        } else if (osverinfo.dwMajorVersion == 6 && osverinfo.dwMinorVersion == 0) {
            return WINDOWS_VERSION_VISTA;
        }    return WINDOWS_VERSION_NONE;
    }
    posted on 2008-07-23 01:40 free2000fly 阅读(1455) 评论(0)  编辑 收藏 引用