驱动中获取Windows版本号
在写驱动程序时,我们发现对于Windows的不同版本,其对应的内核数据结构是不同的,所以在具体操作时同样要根据Windows的不同版本进行不同的操作,那么怎样获取Windows的版本,并且Windows的不同版本的结构模式应如何区别,这是下面要解决的问题。MSDN上提到PsGetVersion是已经过时的函数版本,如果要在XP或以后的版本上获取Windows的版本号,就用RtlGetVersion。所以这两个函数对应的版本还是有所不同的,那么怎样区别性的对待这两种不同的函数呢?下面是一个博客上提供的一种方法,就是用试探式区分:用RtlGetVersion获取版本号,如果成功,则认为当前版本是XP及以后版本,否则认为是XP以下的版本。
typedef enum WIN_VER_DETAIL
{ WINDOWS_VERSION_UNKNOWN, // 0 WINDOWS_VERSION_2K, WINDOWS_VERSION_XP, WINDOWS_VERSION_2K3, WINDOWS_VERSION_2K3_SP1_SP2, WINDOWS_VERSION_VISTA, WINDOWS_VERSION_7, } WIN_VER_DETAIL; typedef NTSTATUS (NTAPI * PFN_RtlGetVersion)(OUT PRTL_OSVERSIONINFOW lpVersionInformation); WIN_VER_DETAIL GetWindowsVersion() { RTL_OSVERSIONINFOEXW OSVersionInfoEx = { sizeof(RTL_OSVERSIONINFOEXW) }; PFN_RtlGetVersion pfnRtlGetVersion = NULL; pfnRtlGetVersion = (PFN_RtlGetVersion)GetFunctionAddr(L"RtlGetVersion"); if ( NULL == pfnRtlGetVersion) { PsGetVersion(&OSVersionInfoEx.dwMajorVersion,&OSVersionInfoEx.dwMinorVersion, &OSVersionInfoEx.dwBuildNumber,NULL); } else { pfnRtlGetVersion((PRTL_OSVERSIONINFOW)&OSVersionInfoEx); } if (5 == OSVersionInfoEx.dwMajorVersion) { switch (OSVersionInfoEx.dwMinorVersion) { case 0: return WINDOWS_VERSION_2K; case 1: return WINDOWS_VERSION_XP; case 2: if (0 == OSVersionInfoEx.wServicePackMajor) return WINDOWS_VERSION_2K3; else return WINDOWS_VERSION_2K3_SP1_SP2; } } if (6 == OSVersionInfoEx.dwMajorVersion) { switch (OSVersionInfoEx.dwMinorVersion) { case 0: return WINDOWS_VERSION_VISTA; case 1: return WINDOWS_VERSION_7; } } return WINDOWS_VERSION_UNKNOWN; }
ULONG GetFunctionAddr( IN PCWSTR FunctionName) { UNICODE_STRING UniCodeFunctionName; RtlInitUnicodeString( &UniCodeFunctionName, FunctionName ); return (ULONG)MmGetSystemRoutineAddress( &UniCodeFunctionName ); }

浙公网安备 33010602011771号