• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-60  評(píng)論-262  文章-1  trackbacks-0
            之所以有此一問(wèn), 是因?yàn)椴煌姹镜?Windows, 甚至同一版本的不同 SP, 其內(nèi)核數(shù)據(jù)結(jié)構(gòu)是不同的, 而開(kāi)發(fā)驅(qū)動(dòng)程序經(jīng)常要直接操縱這些內(nèi)核數(shù)據(jù)結(jié)構(gòu), 就必須得到 Windows 版本的詳細(xì)信息.

            如何在內(nèi)核里取得 windows 詳細(xì)版本號(hào)始終是困擾驅(qū)動(dòng)開(kāi)發(fā)人的一個(gè)不大不小的問(wèn)題, 因?yàn)?PsGetVersion 函數(shù)的最后一個(gè)參數(shù)根本就不起作用, 得不到 SP 版本號(hào), 而 RtlGetVersion 函數(shù)是在 Windows XP 才提供的, 不具通用性.

            因此, 我寫了一個(gè)函數(shù), 將這兩個(gè)函數(shù)封裝在一起, 讓其首先試圖調(diào)用 RtlGetVersion 函數(shù), 如果失敗了, 表明這肯定是 Windows 2000 及以下系統(tǒng), 目前我們一般只支持到 Windows 2000, 至于 undocumented 內(nèi)核數(shù)據(jù)結(jié)構(gòu), 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 閱讀(3801) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            91精品国产91久久久久福利| 亚洲国产精品无码久久98| 国产成人精品白浆久久69| 久久亚洲精品无码VA大香大香| 伊人久久大香线蕉无码麻豆| 中文国产成人精品久久亚洲精品AⅤ无码精品| 久久99精品国产99久久6| 久久精品一区二区国产| 久久精品国产精品亚洲艾草网美妙| 老司机国内精品久久久久| 亚洲AV无码久久寂寞少妇| 狠狠久久综合| 国产精品久久久久久久| 久久精品人妻中文系列| 久久亚洲中文字幕精品一区四| 国产美女亚洲精品久久久综合| 久久久久久无码国产精品中文字幕 | 久久精品一本到99热免费| 久久综合成人网| 欧美久久综合性欧美| 国产欧美久久一区二区| 蜜臀av性久久久久蜜臀aⅴ麻豆| 蜜桃麻豆www久久国产精品| 99久久精品国产综合一区 | 狠狠色丁香婷婷综合久久来| 77777亚洲午夜久久多喷| 狠狠色丁香婷婷久久综合| 人妻无码久久精品| 久久久久无码中| 精品久久久久久无码中文野结衣| 国产精品久久自在自线观看| 99久久人妻无码精品系列| 国产精品久久久久久久久| 青青青青久久精品国产h| 色噜噜狠狠先锋影音久久| 91精品国产色综合久久| 狠狠色婷婷综合天天久久丁香| 99久久精品日本一区二区免费| 久久综合香蕉国产蜜臀AV| 精品永久久福利一区二区| 久久亚洲综合色一区二区三区|