• <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 閱讀(3801) 評論(0)  編輯 收藏 引用
            囯产极品美女高潮无套久久久| 久久久青草久久久青草| 亚洲国产成人乱码精品女人久久久不卡 | 久久精品国产只有精品2020| 久久精品国产国产精品四凭| 伊人久久大香线焦AV综合影院| 精品久久久久久无码专区| 国产激情久久久久影院老熟女免费| 久久久久久精品免费免费自慰| 国内精品久久久久久野外| 久久婷婷五月综合97色直播| 久久亚洲国产中v天仙www| 久久人人爽人人爽人人片AV东京热| 国产2021久久精品| 国产人久久人人人人爽| 久久精品成人欧美大片| 久久久久久A亚洲欧洲AV冫| 久久婷婷国产综合精品| 久久久久久伊人高潮影院| 久久久久99精品成人片| 久久99热狠狠色精品一区| 亚洲人成伊人成综合网久久久| 久久人人爽人人精品视频| 激情五月综合综合久久69| 精品久久久久久国产| 九九久久99综合一区二区| 少妇久久久久久久久久| 色综合久久久久综合体桃花网| 一本色综合久久| 久久久精品人妻一区二区三区蜜桃| 日韩十八禁一区二区久久| 亚洲精品无码久久久久AV麻豆| 久久久综合香蕉尹人综合网| 久久无码AV中文出轨人妻 | 免费久久人人爽人人爽av| 性做久久久久久久久老女人| 亚洲国产天堂久久综合| 久久久久久久久久久久久久| 伊人久久综合无码成人网| 色综合久久久久综合体桃花网| 精品国产VA久久久久久久冰|