• <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 閱讀(3785) 評論(0)  編輯 收藏 引用
            久久偷看各类wc女厕嘘嘘| 伊人久久免费视频| 男女久久久国产一区二区三区| 国产精品久久久久久五月尺| 久久国语露脸国产精品电影| 久久精品国产99久久久古代| 久久精品视频网| 久久久亚洲精品蜜桃臀| 色欲av伊人久久大香线蕉影院| 色综合久久88色综合天天| 久久久噜噜噜久久中文字幕色伊伊 | 久久国产高清一区二区三区| 久久久久99精品成人片三人毛片| 武侠古典久久婷婷狼人伊人| 成人国内精品久久久久一区 | 中文字幕无码av激情不卡久久| 久久亚洲私人国产精品| 久久亚洲国产成人精品无码区| 色欲久久久天天天综合网| 久久久久99精品成人片三人毛片 | 久久久久人妻一区精品| 久久国产亚洲高清观看| 亚洲日本久久久午夜精品| 精品综合久久久久久88小说| 97久久香蕉国产线看观看| 久久久久久久久久久精品尤物| 久久久久久一区国产精品| 亚洲乱亚洲乱淫久久| 久久综合丝袜日本网| 久久天堂电影网| 国内精品伊人久久久久| 97久久天天综合色天天综合色hd | 国产精品一久久香蕉国产线看观看| 国产精品嫩草影院久久| 国产精品日韩欧美久久综合| 天天综合久久久网| 一级做a爰片久久毛片16| 国产激情久久久久影院| 久久99精品久久久久久齐齐| 色综合久久天天综线观看| 久久一区二区三区免费|