之所以有此一問, 是因?yàn)椴煌姹镜?Windows, 甚至同一版本的不同 SP, 其內(nèi)核數(shù)據(jù)結(jié)構(gòu)是不同的, 而開發(fā)驅(qū)動(dòng)程序經(jīng)常要直接操縱這些內(nèi)核數(shù)據(jù)結(jié)構(gòu), 就必須得到 Windows 版本的詳細(xì)信息.
如何在內(nèi)核里取得 windows 詳細(xì)版本號(hào)始終是困擾驅(qū)動(dòng)開發(fā)人的一個(gè)不大不小的問題, 因?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 閱讀(3785)
評(píng)論(0) 編輯 收藏 引用