获取操作系统OS等相关信息

问题一:Windows SDK 8.1版本中的VersionHelper.h文件当中没有IsWindows10ORGreater,所以当你用IsWindows8Point1ORGreater判断出版本信息是Windows8.1以上的版本后,你就无法区分它到底是Win8.1还是Win10.
问题二:使用GetVersionEx这个API配合结构体OSVERSIONINFOEX这个方法获取版本信息,那么Win8以上的系统不论是Win8.1还是Win10都会被判定为主版本号为6,次版本号为2(即Win8的版本号)。
那么如何区分Win8.1和Win10?
使用如下未文档化API:
RtlGetNtVersionNumbers。
1 string GetNtVersionNumbers()
2 {
3 HMODULE hModNtdll = NULL;
4 DWORD dwMajorVer, dwMinorVer, dwBuildNumber;
5 OSVERSIONINFOEX lpVersionInformation;
6
7 BOOL set = GetVersionExW((OSVERSIONINFO *)&lpVersionInformation);
8
9 if ((lpVersionInformation.dwMajorVersion >= 6) && (lpVersionInformation.dwMinorVersion >= 2))
10 {
11 if (hModNtdll = ::LoadLibraryW(L"ntdll.dll"))
12 {
13 typedef void (WINAPI *pfRTLGETNTVERSIONNUMBERS)(DWORD*, DWORD*, DWORD*);
14 pfRTLGETNTVERSIONNUMBERS pfRtlGetNtVersionNumbers;
15 pfRtlGetNtVersionNumbers = (pfRTLGETNTVERSIONNUMBERS)::GetProcAddress(hModNtdll, "RtlGetNtVersionNumbers");
16 if (pfRtlGetNtVersionNumbers)
17 {
18 pfRtlGetNtVersionNumbers(&dwMajorVer, &dwMinorVer, &dwBuildNumber);
19 dwBuildNumber &= 0x0ffff;
20 }
21 ::FreeLibrary(hModNtdll);
22 hModNtdll = NULL;
23 }
24 }
25 string version = to_string(dwMajorVer) + "." + to_string(dwMinorVer) + "." + to_string(dwBuildNumber);
26 return version;
27 }
获取计算机操作系统信息基本可以依靠一下几个函数来完成
CString strOperatingSystem(OSVERSIONINFOEX str,BOOL tes)
{
// 系统信息
CString pszOS,gszOS;
if(tes)
pszOS = _T("Windows");
else
pszOS = _T("Win"); switch (str.dwPlatformId)
{
case VER_PLATFORM_WIN32_NT:
if ( str.dwMajorVersion <= 4 )
pszOS += _T("NT");
else if ( str.dwMajorVersion == 5 )
{
if( str.dwMinorVersion == 0 )
pszOS += _T("2000");
else if( str.dwMinorVersion == 1 )
pszOS += _T("XP");
else if( str.dwMinorVersion == 2 )
{
if(str.wProductType==VER_NT_WORKSTATION )
pszOS += _T("XP_x64");
else
pszOS += _T("2003");
}
}
else if ( str.dwMajorVersion == 6 )
{
if( str.dwMinorVersion == 0 )
{
if(str.wProductType == VER_NT_WORKSTATION)
pszOS += _T("Vista");
else
pszOS += _T("2008");
}
else if( str.dwMinorVersion == 1 )
{
if(str.wProductType == VER_NT_WORKSTATION)
pszOS += _T("7");
else
pszOS += _T("2008R2");
}
else if( str.dwMinorVersion == 2 )
{
if(str.wProductType == VER_NT_WORKSTATION)
pszOS += _T("8");
else
pszOS += _T("2012");
}
else if( str.dwMinorVersion == 3 )
{
if(str.wProductType == VER_NT_WORKSTATION)
pszOS += _T("8.1");
else
pszOS += _T("2012R2");
}
else
pszOS += _T("Null");
}
else if ( str.dwMajorVersion == 10 )
{
if( str.dwMinorVersion == 0 )
{
if(str.wProductType == VER_NT_WORKSTATION)
pszOS += _T("10");
else
pszOS += _T("2016");
}
}
}
if(lstrlen(pszOS))
gszOS.Format("%s SP%d",pszOS,str.wServicePackMajor);
else
gszOS = _T("未知操作系统"); return gszOS;
} // 读取系统位数
DWORD IsWow64()
{
DWORD bIsWow = 32;
BOOL bIsWow64 = FALSE;
FARPROC fnIsWow64Process = GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "IsWow64Process"); if(fnIsWow64Process)
((BOOL (WINAPI *)(HANDLE, PBOOL))fnIsWow64Process)(GetCurrentProcess(), &bIsWow64); if(bIsWow64)
bIsWow = 64;
else
bIsWow = 32; return bIsWow;
} BOOL GetNtVersionNumbers(DWORD&dwMajorVer, DWORD& dwMinorVer,DWORD& dwBuildNumber)
{
BOOL bRet= FALSE;
HMODULE hModNtdll= NULL;
if (hModNtdll= ::LoadLibraryW(L"ntdll.dll"))
{
typedef void (WINAPI *pfRTLGETNTVERSIONNUMBERS)(DWORD*,DWORD*, DWORD*);
pfRTLGETNTVERSIONNUMBERS pfRtlGetNtVersionNumbers;
pfRtlGetNtVersionNumbers = (pfRTLGETNTVERSIONNUMBERS)::GetProcAddress(hModNtdll, "RtlGetNtVersionNumbers");
if (pfRtlGetNtVersionNumbers)
{
pfRtlGetNtVersionNumbers(&dwMajorVer, &dwMinorVer,&dwBuildNumber);
dwBuildNumber&= 0x0ffff;
bRet = TRUE;
}
::FreeLibrary(hModNtdll);
hModNtdll = NULL;
} return bRet;
} // 获取系统版本号
BOOL g_GetVersionEx(OSVERSIONINFOEX &lpVersionInformation)
{
ZeroMemory(&lpVersionInformation, sizeof(OSVERSIONINFOEX));
lpVersionInformation.dwOSVersionInfoSize=sizeof(OSVERSIONINFOEX);
BOOL set = GetVersionExA((OSVERSIONINFO *)&lpVersionInformation); if((lpVersionInformation.dwMajorVersion >= 6)&&(lpVersionInformation.dwMinorVersion >= 2))
{
DWORD dwMajorVer,dwMinorVer,dwBuildNumber;
GetNtVersionNumbers(dwMajorVer,dwMinorVer,dwBuildNumber);
lpVersionInformation.dwMajorVersion = dwMajorVer;
lpVersionInformation.dwMinorVersion = dwMinorVer;
} return set;
}
void main()
{
// TODO: Add your control notification handler code here
OSVERSIONINFOEX Log_OsVerInfoEx; // 系统版本信息
g_GetVersionEx(Log_OsVerInfoEx);
CString VerInfo;
VerInfo.Format("%d.%d %s[%d位]",Log_OsVerInfoEx.dwMajorVersion,Log_OsVerInfoEx.dwMinorVersion,strOperatingSystem(Log_OsVerInfoEx,TRUE),IsWow64());
SetDlgItemText(IDC_VERLNFOEX,VerInfo);
}
获取操作系统OS等相关信息的更多相关文章
- AD命令获取计算机、用户相关信息
1. 获取AD用户相关信息(用户名.创建日期.最后修改密码日期.最后登录日期) Get AD users, Name/Created Date/Last change passwd Date/Last ...
- stat(),lstat(),fstat() 获取文件/目录的相关信息
stat 的使用 Linux有个命令,ls -l,效果如下: 这个命令能显示文件的类型.操作权限.硬链接数量.属主.所属组.大小.修改时间.文件名.它是怎么获得这些信息的呢,请看下面的讲解. stat ...
- 编程实战——电影管理器之利用MediaInfo获取高清视频文件的相关信息
随着高速(20M)宽带.HTPC.大容量硬盘(3T)的普及,下载高清片并利用大屏幕观看也成为普通的事情. 随着下载影片的增多,管理就有了问题,有时在茫茫文件夹下找寻一个影片也是一件费时费力的事. 于是 ...
- java 利用ManagementFactory获取jvm,os的一些信息--转
原文地址:http://blog.csdn.net/dream_broken/article/details/49759043 想了解下某个Java项目的运行时jvm的情况,可以使用一些监控工具,比如 ...
- android 获取 imei号码 及相关信息
android 获取 imei号码 参考:http://www.cnblogs.com/luxiaofeng54/archive/2011/03/01/1968063.html 核心代码: Imei ...
- asp.net中获取本机的相关信息!(CPU、内存、硬盘序列号等)
// 注意:首先要在项目bin目录中添加引用 System.Management using System;using System.Collections.Generic;using System. ...
- iOS获取运营商的相关信息
1.导入:CoreTelephony.framework 2.添加头文件 #import <CoreTelephony/CTTelephonyNetworkInfo.h> #import ...
- 【Android M】获取屏幕锁定的相关信息:“无”,“滑动”,“PIN码”,"图案","密码"
ENV: Android M 6.0.1 import android.os.UserHandle; import com.android.internal.widget.LockPa ...
- 获取APP和设备相关信息
APP NAME: [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"] APP ...
随机推荐
- [leetcode] 37. 解数独(Java)(dfs,递归,回溯)
37. 解数独 1A 这个题其实15分钟左右就敲出来并且对了...但是由于我输错了一个数..导致我白白debug一个多小时.. 没啥难度,练递归-dfs的好题 class Solution { pri ...
- docker部署安装流程第一版
docker部署安装流程第一版 1.以Dockerfile的方式进行构建docker 以cloud 新联盟为例 dockerfile from hub.c.163.com/library/maven ...
- Django框架之路由层汇总
一 Django中路由的作用 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于客户端发来 ...
- Appium_adb常用命令总结
以下为在工作学习过程中总结的常用的adb命令,用来做后续参考和查阅: 一.常用命令 显示当前运行的全部模拟器: adb devices 安装应用程序: adb install 应用程序.apk 备注 ...
- MySQL:count()用法
语法 COUNT() 函数返回匹配指定条件的行数. COUNT(column_name) 语法 COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入): SELECT CO ...
- 【NX二次开发】Block UI 反向
属性说明 属性 类型 描述 常规 BlockID String 控件ID Enable Logical 是否可操作 Group ...
- 不会 Web 开发,也能让数据“动”起来的开源项目!
本文面向有 Python 基础的小伙伴,有 Web 基础的更好 作者:HelloGitHub-吱吱 这里是 HelloGitHub 推出的<讲解开源项目>系列,今天要向小伙伴们介绍的是一个 ...
- Django-ORM-事务和锁
一.锁 行级锁 返回一个锁住行,值到事物结束的查询集. 所有匹配的行将被锁住,直到事物结束,这就意味着可以通过锁防止数据被其他事务修改. 一般情况下如果其他事务锁定了相关行,那么本查询将被阻塞直到锁被 ...
- Java语言实现二维码的生成
众所周知,现在生活中二维码已经是无处不见.走在街道上,随处可见广告标语旁有二维码,手机上QQ,微信加个好友都能通过二维码的方式,我不知道是什么时候兴起的二维码浪潮,但是我知道,这在我小时候可是见不到的 ...
- Vue项目的开发流程
我先安装的node.js 1.确认已安装了node.js,可在cmd中输入( node -v和npm -v),如显示出版号,说明安装成功 2.安装webpack 和webpack-cli 在全局下安装 ...