驱动中获取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 );   
}
posted @ 2012-11-20 16:57  legendmaner  阅读(1253)  评论(0)    收藏  举报