在驱动中获得Windows的版本号
来源:互联网 发布:软件测试性能指标 编辑:程序博客网 时间:2024/05/28 06:06
在写驱动程序时,我们发现对于Windows的不同版本,其对应的内核数据结构是不同的,所以在具体操作时同样要根据Windows的不同版本进行不同的操作,那么怎样获取Windows的版本,并且Windows的不同版本的结构模式应如何区别,这是下面要解决的问题。MSDN上提到PsGetVersion是已经过时的函数版本,如果要在XP或以后的版本上获取Windows的版本号,就用RtlGetVersion。所以这两个函数对应的版本还是有所不同的,那么怎样区别性的对待这两种不同的函数呢?下面是一个博客上提供的一种方法,就是用试探式区分:用RtlGetVersion获取版本号,如果成功,则认为当前版本是XP及以后版本,否则认为是XP以下的版本。
下面是函数的实现:
typedef enum WIN_VER_DETAIL {
WINDOWS_VERSION_NONE, // 0
WINDOWS_VERSION_2K,
WINDOWS_VERSION_XP,
WINDOWS_VERSION_2K3,
WINDOWS_VERSION_2K3_SP1_SP2,//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);
//判断XP前后版本,调用不同的函数获得版本号
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 (6 == OSVersionInfoEx.dwMajorVersion)
{
switch (OSVersionInfoEx.dwMinorVersion)
{
case 0:
return WINDOWS_VERSION_VISTA;
case 1:
return WINDOWS_VERSION_7;
}
}
return WINDOWS_VERSION_NONE;
}
- 在驱动中获得Windows的版本号
- 如何获得Windows mobile的操作系统版本号?
- 如何通过程序获得Windows Media Player的版本号
- 获得IOS的版本号
- 【Android】使用Gradle打包时,获取svn的版本号,删除unalign.apk文件,获得版本号,并设定在打包的文件名称中
- AX中获得Excel版本号
- 如何在Windows Mobile中获得本机的电话号码?
- 如何在Windows Mobile中获得本机的电话号码?
- 如何获得IE的版本号
- Delphi 获得程序的版本号
- Delphi 获得应用程序的版本号
- 如何获得eclipse的版本号
- 获得当前程序的版本号
- 获得当前应用的版本号
- 在WDM驱动中如何获得PCI卡的物理Slot号
- 在内核驱动中,获得到当前进程的全路径
- windows版本号的获取
- 获得版本号
- 驱动实现win7下cmd提权
- 线程同步
- 来自雅虎的网站优化加速最佳实践
- ubuntu 挂载 nfs 成功后无法umount 提示 device is busy 解决方案
- jquery json
- 在驱动中获得Windows的版本号
- Json in Java 的使用
- VC环境下UDP Socket编程 depend vc2010
- mount.nfs: access denied by server while mounting 一个解决办法
- iOS图形处理类和NSAttributedString
- qemu-guest-agent windows下的监控开发
- Ubuntu下配置NFS服务
- 勉强没有幸福
- C#-Mdi多文档窗口及其子窗口的排列 ---ShinePans