请问如何获取系统版本 请问如何在Ring0下获取系统版本 例如我的电脑是XP SP3 那有什么NT API可以获取? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 推荐:http://www.cppblog.com/free2000fly/archive/2008/07/23/56904.html如何在驱动中取得 windows 的详细版本号之所以有此一问, 是因为不同版本的 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 阅读(1455) 评论(0) 编辑 收藏 引用 求一个写文件的库 串口接收代码找错 高手救命!在线等待,up有分 被学校放出来了,散分!!顺便问个问题^Q^ 关于对话框中的控件 高人们,是不是new语句惹得祸 Access数据库中如何存储文件路径啊,大侠请指点。 引用第三方库(*.lib),包含头文件的问题 vc访问oracle怎么才能不用装客户端和oledb for oracle驱动? *****OpenGL的图怎样存为BMP位图,解决后一定再加分******(内空) 如何在MFC中通过编辑框读入数组? c++,float类型的变量的if语句
http://www.cppblog.com/free2000fly/archive/2008/07/23/56904.html如何在驱动中取得 windows 的详细版本号
之所以有此一问, 是因为不同版本的 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 阅读(1455) 评论(0) 编辑 收藏 引用