C/C++应用--Window下获取硬件信息(CPU, 硬盘,网卡等)
一、头文件如下:
#include <Windows.h>
#include <string>
#include <iostream>
#include <winnt.h>
#include <tchar.h>
#include <IPHlpApi.h>
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"Advapi32.lib")
#pragma comment(lib, "Iphlpapi.lib")
using namespace std; // ***** global macros ***** //
#define GBYTES 1073741824
#define MBYTES 1048576
#define KBYTES 1024
#define DKBYTES 1024.0 class CSysInfo
{
public:
CSysInfo();
~CSysInfo(); public:
const std::string GetOSVersion();
void SafeGetNativeSystemInfo(LPSYSTEM_INFO lpSystemInfo);
const std::string GetCPUInfo();
const std::string GetMemoryStatus(); void GetNetCardAndIPInfo(std::string &adapter_info, std::string &MAC_address, std::string &IP);
const std::string GetComputerUserName();
BOOL GetHardDiskInfo(LPTSTR pModelNo, LPTSTR pSerialNo);
void ToLittleEndian(PUSHORT pWords, int nFirstIndex, int nLastIndex, LPTSTR pBuf); };
二、cpp如下:
#include "SysInfo.h" CSysInfo::CSysInfo()
{
} CSysInfo::~CSysInfo()
{
} const std::string CSysInfo::GetOSVersion()
{
std::string os_version("");
SYSTEM_INFO system_info;
memset(&system_info, , sizeof(SYSTEM_INFO));
GetSystemInfo(&system_info);
OSVERSIONINFOEX os;
os.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
if (GetVersionEx((OSVERSIONINFO *)&os))
{
switch (os.dwMajorVersion) {
case :
//1996年7月发布
switch (os.dwMinorVersion) {
case :
if (os.dwPlatformId == VER_PLATFORM_WIN32_NT)
os_version = "Microsoft Windows NT 4.0 ";
else if (os.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
os_version = "Microsoft Windows 95 ";
break;
case :
os_version = "Microsoft Windows 98 ";
break;
case :
os_version = "Microsoft Windows Me ";
break;
}
break;
case :
switch (os.dwMinorVersion) {
//1999年12月发布
case :
os_version = "Microsoft Windows 2000 ";
if (os.wSuiteMask == VER_SUITE_ENTERPRISE)
os_version.append("Advanced Server ");
break;
//2001年8月发布
case :
os_version = "Microsoft Windows XP ";
if (os.wSuiteMask == VER_SUITE_EMBEDDEDNT)
os_version.append("Embedded ");
else if (os.wSuiteMask == VER_SUITE_PERSONAL)
os_version.append("Home Edition ");
else
os_version.append("Professional ");
break;
case :
if (os.wProductType == VER_NT_WORKSTATION &&
system_info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
os_version = "Microsoft Windows XP Professional x64 Edition ";
if (GetSystemMetrics(SM_SERVERR2) == && os.wSuiteMask == VER_SUITE_BLADE)
os_version = "Microsoft Windows Server 2003 Web Edition ";
else if (GetSystemMetrics(SM_SERVERR2) == && os.wSuiteMask == VER_SUITE_COMPUTE_SERVER)
os_version = ("Microsoft Windows Server 2003 Compute Cluster Edition ");
else if (GetSystemMetrics(SM_SERVERR2) == && os.wSuiteMask == VER_SUITE_STORAGE_SERVER)
os_version = ("Microsoft Windows Server 2003 Storage Server ");
else if (GetSystemMetrics(SM_SERVERR2) == && os.wSuiteMask == VER_SUITE_DATACENTER)
os_version = ("Microsoft Windows Server 2003 Datacenter Edition ");
else if (GetSystemMetrics(SM_SERVERR2) == && os.wSuiteMask == VER_SUITE_ENTERPRISE)
os_version = ("Microsoft Windows Server 2003 Enterprise Edition ");
else if (GetSystemMetrics(SM_SERVERR2) != && os.wSuiteMask == VER_SUITE_STORAGE_SERVER)
os_version = ("Microsoft Windows Server 2003 R2 Storage Server ");
break;
}
break;
case :
switch (os.dwMinorVersion) {
case :
if (os.wProductType == VER_NT_WORKSTATION)
{
os_version = "Microsoft Windows Vista ";
if (os.wSuiteMask == VER_SUITE_PERSONAL)
os_version.append("Home ");
}
else if (os.wProductType != VER_NT_WORKSTATION)
{
os_version = "Microsoft Windows Server 2008 ";
if (os.wSuiteMask == VER_SUITE_DATACENTER)
os_version.append("Datacenter Server ");
else if (os.wSuiteMask == VER_SUITE_ENTERPRISE)
os_version.append("Enterprise ");
}
break;
case :
if (os.wProductType == VER_NT_WORKSTATION)
os_version = "Microsoft Windows 7 ";
else
os_version = "Microsoft Windows Server 2008 R2 ";
break;
}
break;
default:
os_version = "? ";
}
}
SYSTEM_INFO si;
SafeGetNativeSystemInfo(&si);
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||
si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64)
os_version.append("64bit");
else os_version.append("32bit");
return os_version; } void CSysInfo::SafeGetNativeSystemInfo(LPSYSTEM_INFO lpSystemInfo)
{
if (NULL == lpSystemInfo)
return;
typedef VOID(WINAPI *LPFN_GetNativeSystemInfo)(LPSYSTEM_INFO lpSystemInfo);
LPFN_GetNativeSystemInfo nsInfo =
(LPFN_GetNativeSystemInfo)GetProcAddress(GetModuleHandle(_T("kernel32")), "GetNativeSystemInfo");;
if (NULL != nsInfo)
{
nsInfo(lpSystemInfo);
}
else
{
GetSystemInfo(lpSystemInfo);
} } const std::string CSysInfo::GetCPUInfo()
{
std::string processor_name("");
std::string str_path = "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0";
HKEY key;
if (::RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCSTR)str_path.c_str(), , KEY_ALL_ACCESS, &key) == ERROR_SUCCESS)
{
char processor_value[];
DWORD type = REG_SZ;
DWORD value_size = sizeof(processor_value);
if (::RegQueryValueEx(key, "ProcessorNameString", , &type, (LPBYTE)&processor_value, &value_size) == ERROR_SUCCESS)
processor_name.append(processor_value, value_size);
RegCloseKey(key); }
return processor_name;
} const std::string CSysInfo::GetMemoryStatus()
{
std::string memory_info("");
MEMORYSTATUSEX statusex;
statusex.dwLength = sizeof(statusex);
if (GlobalMemoryStatusEx(&statusex))
{
unsigned long long total = , remain_total = , avl = , remain_avl = ;
double decimal_total = , decimal_avl = ;
remain_total = statusex.ullTotalPhys % GBYTES;
total = statusex.ullTotalPhys / GBYTES;
avl = statusex.ullAvailPhys / GBYTES;
remain_avl = statusex.ullAvailPhys % GBYTES;
if (remain_total > )
decimal_total = (remain_total / MBYTES) / DKBYTES;
if (remain_avl > )
decimal_avl = (remain_avl / MBYTES) / DKBYTES; decimal_total += (double)total;
decimal_avl += (double)avl;
char buffer[MAX_PATH];
//sprintf_s(buffer, MAX_PATH, "%.2f GB (%.2f GB可用)", decimal_total, decimal_avl);
sprintf_s(buffer, MAX_PATH, "%.2f GB", decimal_total);
memory_info.append(buffer);
}
return memory_info;
} void CSysInfo::GetNetCardAndIPInfo(std::string &adapter_info, std::string &MAC_address, std::string &IP)
{
PIP_ADAPTER_INFO pIp_adapter_info = new IP_ADAPTER_INFO();
unsigned long adapter_size = sizeof(IP_ADAPTER_INFO);
int ret = GetAdaptersInfo(pIp_adapter_info, &adapter_size);
if (ERROR_BUFFER_OVERFLOW == ret)
{
delete pIp_adapter_info;
pIp_adapter_info = (PIP_ADAPTER_INFO)new BYTE[adapter_size];
ret = GetAdaptersInfo(pIp_adapter_info, &adapter_size);
}
if (ERROR_SUCCESS == ret)
{
while (pIp_adapter_info)
{
adapter_info.append("name: ");
adapter_info.append(pIp_adapter_info->AdapterName);
adapter_info.append("\ndescription: ");
adapter_info.append(pIp_adapter_info->Description);
adapter_info.append("\ntype: ");
std::string card_type("");
switch (pIp_adapter_info->Type)
{
case MIB_IF_TYPE_OTHER:
card_type = "other";
break;
case MIB_IF_TYPE_ETHERNET:
card_type = "ethernet";
break;
case MIB_IF_TYPE_TOKENRING:
card_type = "tokenring";
break;
case MIB_IF_TYPE_FDDI:
card_type = "fddi";
break;
case MIB_IF_TYPE_PPP:
card_type = "ppp";
break;
case MIB_IF_TYPE_LOOPBACK:
card_type = "loopback";
break;
case MIB_IF_TYPE_SLIP:
card_type = "slip";
break;
default:
break;
}
adapter_info.append(card_type);
MAC_address.append("\nMACAddr: ");
char buffer[MAX_PATH];
for (DWORD i = ; i < pIp_adapter_info->AddressLength; i++)
if (i < pIp_adapter_info->AddressLength - )
{
sprintf_s(buffer, MAX_PATH, "%02X", pIp_adapter_info->Address[i]);
MAC_address.append(buffer);
MAC_address.append("-");
}
else
{
sprintf_s(buffer, MAX_PATH, "%02X", pIp_adapter_info->Address[i]);
MAC_address.append(buffer);
adapter_info.append("\n");
} IP_ADDR_STRING *pIp_addr_string = &(pIp_adapter_info->IpAddressList);
do
{
IP.append("IPAddr:");
IP.append(pIp_addr_string->IpAddress.String);;
IP.append("\nIpMask:");
IP.append(pIp_addr_string->IpMask.String);
IP.append("\nGateway:");
IP.append(pIp_adapter_info->GatewayList.IpAddress.String);
IP.append("\n");
pIp_addr_string = pIp_addr_string->Next;
} while (pIp_addr_string);
adapter_info.append("\n");
pIp_adapter_info = pIp_adapter_info->Next;
} }
if (pIp_adapter_info)
{
delete pIp_adapter_info;
pIp_adapter_info = nullptr;
}
} const std::string CSysInfo::GetComputerUserName()
{ char szUsername[BUFSIZ];
DWORD bufCharCount = BUFSIZ; // Get and display the name of the computer.
if (GetComputerName(szUsername, &bufCharCount)) {
return szUsername; }else {
return "";
} } BOOL CSysInfo::GetHardDiskInfo(LPTSTR pModelNo, LPTSTR pSerialNo)
{
//-1是因为 SENDCMDOUTPARAMS 的结尾是 BYTE bBuffer[1];
BYTE IdentifyResult[sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - ];
DWORD dwBytesReturned;
GETVERSIONINPARAMS get_version;
SENDCMDINPARAMS send_cmd = { }; HANDLE hFile = CreateFile(_T("\\\\.\\PHYSICALDRIVE0"), GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, , NULL);
if (hFile == INVALID_HANDLE_VALUE)
return FALSE; //get version
DeviceIoControl(hFile, SMART_GET_VERSION, NULL, ,
&get_version, sizeof(get_version), &dwBytesReturned, NULL); //identify device
send_cmd.irDriveRegs.bCommandReg = (get_version.bIDEDeviceMap & 0x10) ? ATAPI_ID_CMD : ID_CMD;
DeviceIoControl(hFile, SMART_RCV_DRIVE_DATA, &send_cmd, sizeof(SENDCMDINPARAMS) - ,
IdentifyResult, sizeof(IdentifyResult), &dwBytesReturned, NULL);
CloseHandle(hFile); //adjust the byte order
PUSHORT pWords = (USHORT*)(((SENDCMDOUTPARAMS*)IdentifyResult)->bBuffer); ToLittleEndian(pWords, , , pModelNo);
ToLittleEndian(pWords, , , pSerialNo); return true;
} //把WORD数组调整字节序为little-endian,并滤除字符串结尾的空格。
void CSysInfo::ToLittleEndian(PUSHORT pWords, int nFirstIndex, int nLastIndex, LPTSTR pBuf)
{
int index;
LPTSTR pDest = pBuf;
for (index = nFirstIndex; index <= nLastIndex; ++index)
{
pDest[] = pWords[index] >> ;
pDest[] = pWords[index] & 0xFF;
pDest += ;
}
*pDest = ; //trim space at the endof string; 0x20: _T(' ')
--pDest;
while (*pDest == 0x20)
{
*pDest = ;
--pDest;
}
}
C/C++应用--Window下获取硬件信息(CPU, 硬盘,网卡等)的更多相关文章
- 使用dmidecode在Linux下获取硬件信息
dmidecode命令可以让你在Linux系统下获取有关硬件方面的信息.dmidecode的作用是将DMI数据库中的信息解码,以可读的文本方式显示.由于DMI信息可以人为修改,因此里面的信息不一定是系 ...
- linux下dmidecode命令获取硬件信息
linux下dmidecode命令获取硬件信息 2 A+ 所属分类:Linux 运维工具 dmidecode在 Linux 系统下获取有关硬件方面的信息.dmidecode 遵循 SMBIOS/DMI ...
- Linux 系统下查看硬件信息命令大全
有许多命令可以用来查看 Linux 系统上的硬件信息.有些命令只能够打印出像 CPU 和内存这一特定的硬件组件信息,另外一些命令可以查看多种硬件组件的信息. 这个教程可以带大家快速了解一下查看各种硬件 ...
- WMI 获取硬件信息的封装函数与获取联想台式机的出厂编号方法
原文:WMI 获取硬件信息的封装函数与获取联想台式机的出厂编号方法 今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都是可以提取出来的,就自己把那些公共部分提出出来,以后如果要获取 某部分的 ...
- 用C++和shell获取本机CPU、网卡IO、内存、磁盘等的基本信息
用C++和shell获取本机CPU.网卡.内存.磁盘等的基本信息: 由于对C++相关的函数没多少了解,但是觉得用shell反而相对简单一些: 一.shell脚本,用来辅助C++获取主机的资源使用信息 ...
- Web网站中利用JavaScript中ActiveXObject对象获取硬件信息(显示器数量、分辨率)从而进行单双屏跳转
前言:最近这两天工作上,要实现一个功能,在好友阿聪的帮助下,算是比较好的解决了这个需求. B/S的Web网站,需要实现点击按钮时,根据客户端连接的显示屏(监视器)数量进行,单双屏跳转显示新页面. 由于 ...
- Linux系统下查看硬件信息命令大全
导读 有许多命令可以用来查看 Linux 系统上的硬件信息.有些命令只能够打印出像 CPU 和内存这一特定的硬件组件信息,另外一些命令可以查看多种硬件组件的信息. 这个教程可以带大家快速了解一下查看各 ...
- C#获取硬件信息
//硬件信息 public class GF_Hardware { /// <summary> /// cpu序列号 /// </summary> /// <return ...
- C++ WMI获取系统硬件信息(CPU/DISK/NetWork etc)
官网找到一个例子,根据例子修改下可以获取很多信息 #define _WIN32_DCOM #include <iostream> using namespace std; #include ...
随机推荐
- 5-6 c语言之【枚举,联合体,递归】
今天学习了枚举,联合体,递归,重点在于递归,所以从网上找到了一些递归的题目进行练习,毕竟程序员界流传一句话,会用循环的是人,会用递归的是神,哈哈哈 还是按次序进行梳理,第一个枚举,枚举和宏定义很相似, ...
- SAS学习笔记9 利用SAS绘制地图
绘制世界地图 proc gmap过程: map=指定绘图的map数据集 data=指定地图的对应数据集 id指定map数据集和对应数据集中都有的变量,一般为各区域的代码,作为两个数据集的连接变量 分色 ...
- WebSocket协议探究(三):MQTT子协议
一 复习和目标 1 复习 Nodejs实现WebSocket服务器 Netty实现WebSocket服务器(附带了源码分析) Js api实现WebSocket客户端 注:Nodejs使用的Socke ...
- 【Transact-SQL】统计某字段中的值第一次出现后的2小时内出现的次数
原文:[Transact-SQL]统计某字段中的值第一次出现后的2小时内出现的次数 table1 name createdate a 2011-03-01 10:00:00 a 2011-03-01 ...
- python实现tcp代理
1.代理流程图 2.实现代码 #! usr/bin/python2 import sys import socket import thread #handle local buffer def re ...
- node express4 + 前端自动刷新
官网快速生成:http://www.expressjs.com.cn/starter/generator.html 1.安装 express 1.应用生成器工具 express-generator ...
- 原生js上传图片遇到的坑(axios封装)
后台给我写了一个上传图片的接口,自己用form表单测试成功 接口可以正常跳转 测试的代码: <!doctype html> <html lang="en"> ...
- python matplotlib绘制六种可视化图表
1. 折线图 绘制折线图,如果你数据不是很多的话,画出来的图将是曲折状态,但一旦你的数据集大起来,比如下面我们的示例,有100个点,所以我们用肉眼看到的将是一条平滑的曲线. 这里我绘制三条线,只要执行 ...
- 如何对SAP Leonardo上的机器学习模型进行重新训练
Jerry之前的两篇文章介绍了如何通过Restful API的方式,消费SAP Leonardo上预先训练好的机器学习模型: 如何在Web应用里消费SAP Leonardo的机器学习API 部署在SA ...
- C++——namespace
scope和namespace scope就是我们常说的作用域,namespace是C++引入的一个关键字.这两种都和作用域有些微妙的联系,下面 引自Global scope vs global na ...