获取操作系统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 ...
随机推荐
- SQL 语句大全(简化版)
1. SELECT * FROM 表名 WHERE 1 AND [ORDER BY DESC LIMIT] 2. INSERT INTO 表名 (字段列表) VALUES (值列表) 3. UPDAT ...
- Tensor基本理论
Tensor基本理论 深度学习框架使用Tensor来表示数据,在神经网络中传递的数据均为Tensor. Tensor可以将其理解为多维数组,其可以具有任意多的维度,不同Tensor可以有不同的数据类型 ...
- CVPR2020最新论文扫描盘点(上)
CVPR2020最新论文扫描盘点(上) 最近计算机视觉三大顶会之一CVPR2020接收结果已经公布,一共有1470篇论文被接收,接收率为22%,相比去年降低3个百分点,竞争越来越激烈.这里整理来自Tw ...
- 将十进制数据转换为二进制AND将二进制数据转换为十进制!
一,将十进制数据转换为二进制: //*********************************************** Console.WriteLine(&quo ...
- python_request 接口测试线性框架,模块化思想,增加日志打印
一.大框架 如下为一个简单的线性框架,同时编写common_api 模块,把一个个接口进行封装,案例编写时候只需要直接调用输入参数即可. 二. test_cases 模块具体写法 2.1 commo ...
- NX二次开发-通过3x3矩阵获取XYZ轴矢量
函数:UF_CSYS_ask_wcs() 函数说明:通过3x3矩阵获取XYZ轴矢量 用法: 1 #include <uf.h> 2 #include <uf_mtx.h> 3 ...
- SpringCloud 面试题 (持续更新、吐血推荐)
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...
- NOIP模拟测试25「字符串·乌鸦喝水·所陀门王的宝藏(陀螺王)」
字符串 题解 没看出catalan怎么办 dp打表啊! 考虑大力dp拿到30分好成绩!顺便收获一张表 打表发现$C_{n+m}^{m}-C_{n+m}^{m-1}$ 仔细观察然后发现其实就是之前的网格 ...
- NOIP模拟测试6「那一天我们许下约定(背包dp)·那一天她离我而去」
那一天我们许下约定 内部题,题干不粘了. $30分算法$ 首先看数据范围,可以写出来一个普通dp #include<bits/stdc++.h> #define ll int #defin ...
- Linux命令大全之帮助命令及压缩命令
man(manual):帮助命令 help用于解释shell内部命令 格式:help shell内部命令 ls 命令 --help man 命令 info 命令 .zip .gz .bz ...