• <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  評論-262  文章-1  trackbacks-0
            之所以有此一問, 是因為不同版本的 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 閱讀(3792) 評論(0)  編輯 收藏 引用
            精品国产99久久久久久麻豆 | 久久久久亚洲AV无码麻豆| 久久综合鬼色88久久精品综合自在自线噜噜 | 色播久久人人爽人人爽人人片AV| 久久人妻AV中文字幕| 99国产精品久久| 日产精品久久久久久久| 久久精品免费观看| 久久人人爽人人爽人人av东京热| 日本道色综合久久影院| 国内精品伊人久久久久网站| 久久久99精品成人片中文字幕| 国产色综合久久无码有码| 国产精品熟女福利久久AV| 色婷婷久久综合中文久久蜜桃av| 久久综合一区二区无码| 99久久久久| 五月丁香综合激情六月久久| 久久午夜福利电影| 国产免费久久久久久无码| 久久人人爽人人爽人人AV东京热| 亚洲国产小视频精品久久久三级 | 久久国产一片免费观看| 国产精品久久99| 国产精品久久久久久吹潮| 亚洲国产另类久久久精品小说| 亚洲综合久久夜AV | 一本大道久久东京热无码AV| 久久久久亚洲AV成人网人人软件| 欧美一区二区精品久久| 久久久久免费精品国产| 波多野结衣中文字幕久久| 久久精品国产亚洲AV高清热| 婷婷久久香蕉五月综合加勒比| 77777亚洲午夜久久多人| 久久无码中文字幕东京热| 综合久久国产九一剧情麻豆| 无码人妻精品一区二区三区久久| 合区精品久久久中文字幕一区| 亚洲精品乱码久久久久66| 精品久久人人爽天天玩人人妻|