c++获取系统信息(操作系统,cpu,内存,ip,mac)

来源:互联网 发布:最优化 中科院 编辑:程序博客网 时间:2024/04/26 07:50


#include <stdio.h>

#include <tchar.h>
#include <windows.h>
#include "winsock.h"
#include <string>
#include <iostream>
#include <Iphlpapi.h>
using std::cout;using std::string;using std::iostream;
using std::endl;using std::ios;using std::fstream;
using std::ofstream;using std::cin;
#pragma comment( lib, "Ws2_32.lib")
#pragma comment(lib,"Iphlpapi.lib")
using namespace std;
typedef   void(WINAPI *FunctionGlobalMemoryStatusEx)(LPMEMORYSTATUSEX);//声明函数原型指针
#if (_WIN32_WINNT < 0x0600) // [zyl910] 低版本的Windows SDK没有定义 RelationProcessorPackage 等常量
#define RelationProcessorPackage 3
#define RelationGroup 4
#endif
typedef BOOL (WINAPI *LPFN_GLPI)(
PSYSTEM_LOGICAL_PROCESSOR_INFORMATION, 
PDWORD);
int get_cpu_num(void)
{
LPFN_GLPI glpi;
BOOL done = FALSE;
PSYSTEM_LOGICAL_PROCESSOR_INFORMATION buffer = NULL;
PSYSTEM_LOGICAL_PROCESSOR_INFORMATION ptr = NULL;
DWORD returnLength = 0;
DWORD processorPackageCount = 0;
DWORD byteOffset = 0;


glpi = (LPFN_GLPI) GetProcAddress(
GetModuleHandle(TEXT("kernel32")),
"GetLogicalProcessorInformation");
if (NULL == glpi) 
{
_tprintf(TEXT("\nGetLogicalProcessorInformation is not supported.\n"));
return -1;
}


while (!done)
{
DWORD rc = glpi(buffer, &returnLength);


if (FALSE == rc) 
{
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) 
{
if (buffer) 
free(buffer);


buffer = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)malloc(
returnLength);


if (NULL == buffer) 
{
_tprintf(TEXT("\nError: Allocation failure\n"));
return -2;
}

else 
{
_tprintf(TEXT("\nError %d\n"), GetLastError());
return -3;
}

else
{
done = TRUE;
}
}


ptr = buffer;
while (byteOffset + sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION) <= returnLength) 
{
switch (ptr->Relationship) 
{
case RelationProcessorPackage:
processorPackageCount++;
break;
default:
break;
}
byteOffset += sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION);
ptr++;
}
free(buffer);
return processorPackageCount;
}


void  getSysteminfo(char *version,int size)
{
memset(version,0,size);
SYSTEM_INFO info;                //用SYSTEM_INFO结构判断64位AMD处理器
GetSystemInfo(&info);            //调用GetSystemInfo函数填充结构
OSVERSIONINFOEX os;
os.dwOSVersionInfoSize=sizeof(OSVERSIONINFOEX); 
if(GetVersionEx((OSVERSIONINFO *)&os))                  
{


//下面根据版本信息判断操作系统名称
switch(os.dwMajorVersion){                        //判断主版本号
case 4:
switch(os.dwMinorVersion){                //判断次版本号
case 0:
if(os.dwPlatformId==VER_PLATFORM_WIN32_NT)
strcpy_s(version,size,"Microsoft Windows NT 4.0");
else if(os.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS)
strcpy_s(version,size,"Microsoft Windows 95");
break;
case 10:
strcpy_s(version,size,"Microsoft Windows 98");
break;
case 90:
strcpy_s(version,size,"Microsoft Windows Me");
break;
}
break;
case 5:
switch(os.dwMinorVersion){               //再比较dwMinorVersion的值
case 0:
strcpy_s(version,size,"Microsoft Windows 2000");    //1999年12月发布
break;
case 1:
strcpy_s(version,size,"Microsoft Windows XP"); //2001年8月发布
break;
case 2:
if(os.wProductType==VER_NT_WORKSTATION && 
info.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
strcpy_s(version,size,"Microsoft Windows XP Professional x64 Edition");
else if(GetSystemMetrics(SM_SERVERR2)==0)
strcpy_s(version,size,"Microsoft Windows Server 2003");
else if(GetSystemMetrics(SM_SERVERR2)!=0)
strcpy_s(version,size,"Microsoft Windows Server 2003 R2");
break;
}
break;
case 6:
switch(os.dwMinorVersion){
case 0:
if(os.wProductType==VER_NT_WORKSTATION)
strcpy_s(version,size,"Microsoft Windows Vista");
else
strcpy_s(version,size,"Microsoft Windows Server 2008");  //服务器版本
break;
case 1:
if(os.wProductType==VER_NT_WORKSTATION)
strcpy_s(version,size,"Microsoft Windows 7");
else
strcpy_s(version,size,"Microsoft Windows Server 2008 R2");
break;
case 2:
strcpy_s(version,size,"Microsoft Windows 7");
break;
}
break;
default:
strcpy_s(version,size,"未知操作系统");
}
//获取版本
switch(os.dwMajorVersion){                //先判断操作系统版本
case 5:
switch(os.dwMinorVersion){
case 0:                  //Windows 2000
if(os.wSuiteMask==VER_SUITE_ENTERPRISE)
strcat_s(version,size," Advanced Server");
break;
case 1:                  //Windows XP
if(os.wSuiteMask==VER_SUITE_EMBEDDEDNT)
strcat_s(version,size," Embedded");
else if(os.wSuiteMask==VER_SUITE_PERSONAL)
strcat_s(version,size," Home Edition");
else
strcat_s(version,size," Professional");
break;
case 2:
if(GetSystemMetrics(SM_SERVERR2)==0 && 
os.wSuiteMask==VER_SUITE_BLADE)  //Windows Server 2003
strcat_s(version,size," Web Edition");
else if(GetSystemMetrics(SM_SERVERR2)==0 && 
os.wSuiteMask==VER_SUITE_COMPUTE_SERVER)
strcat_s(version,size," Compute Cluster Edition");
else if(GetSystemMetrics(SM_SERVERR2)==0 && 
os.wSuiteMask==VER_SUITE_STORAGE_SERVER)
strcat_s(version,size," Storage Server");
else if(GetSystemMetrics(SM_SERVERR2)==0 && 
os.wSuiteMask==VER_SUITE_DATACENTER)
strcat_s(version,size," Datacenter Edition");
else if(GetSystemMetrics(SM_SERVERR2)==0 && 
os.wSuiteMask==VER_SUITE_ENTERPRISE)
strcat_s(version,size," Enterprise Edition");
else if(GetSystemMetrics(SM_SERVERR2)!=0 && 
os.wSuiteMask==VER_SUITE_STORAGE_SERVER) 
strcat_s(version,size," Storage Server");
break;
}
break;
case 6:
switch(os.dwMinorVersion){
case 0:
if(os.wProductType!=VER_NT_WORKSTATION && 
os.wSuiteMask==VER_SUITE_DATACENTER) 
strcat_s(version,size," Datacenter Server");
else if(os.wProductType!=VER_NT_WORKSTATION && 
os.wSuiteMask==VER_SUITE_ENTERPRISE)
strcat_s(version,size," Enterprise");
else if(os.wProductType==VER_NT_WORKSTATION && 
os.wSuiteMask==VER_SUITE_PERSONAL)  //Windows Vista
strcat_s(version,size," Home");
break;
}
break;
default:
strcat_s(version,size,"");
}
}
else
strcpy_s(version,size,""); 
}


int get_cpu_info(char *cpu,int size)
{
memset(cpu,0,size);
HKEY hKey;
LPCTSTR  SubKey=_T("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0");
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,SubKey,0,KEY_ALL_ACCESS,&hKey)!=
ERROR_SUCCESS)
{
printf("RegOpenKeyEx错误");
printf("RegOpenKeyEx错误");
return -1;
}
TCHAR   data[128]   =   {0}; 
DWORD dwType = REG_SZ; 
DWORD dwSize=128;


if(RegQueryValueEx(hKey,_T("ProcessorNameString"),NULL,&dwType,(LPBYTE)data,&dwSize)!=ERROR_SUCCESS)
{
printf("RegQueryValueEx错误");
return -1;

RegCloseKey(hKey);
//SYSTEM_INFO info;
int cpu_num;
//GetSystemInfo(&info);
//cpu_num = info.dwNumberOfProcessors;
cpu_num = get_cpu_num();
if(cpu_num<0)
return -1;
#ifdef UNICODE
DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,data,-1,NULL,0,NULL,FALSE);
char *psText;
psText = (char*)malloc(dwNum);


WideCharToMultiByte (CP_OEMCP,NULL,data,-1,psText,dwNum,NULL,FALSE);
sprintf(cpu,"%s (%d 处理器)",psText,cpu_num);
free(psText);
#else
sprintf(cpu,"%s (%d 处理器)",data,cpu_num);
#endif
return 0;
}


double get_phy_mem()
{
MEMORYSTATUSEX memStatex;
memStatex.dwLength = sizeof(memStatex);
FunctionGlobalMemoryStatusEx MyGlobalMemoryStatusEx;
MyGlobalMemoryStatusEx=(FunctionGlobalMemoryStatusEx)GetProcAddress(GetModuleHandle(_T("kernel32.dll")),"GlobalMemoryStatusEx");
if(NULL==MyGlobalMemoryStatusEx)//判断函数是否找到
{
return -1;
}
MyGlobalMemoryStatusEx(&memStatex);//调用函数取得系统的内存情况
if(memStatex.dwLength != sizeof(MEMORYSTATUSEX))
{
return -1;
}
return memStatex.ullTotalPhys/(1024*1024*1024*1.0);
}


void byte2Hex(unsigned char bData,unsigned char hex[])
{
int high=bData/16,low =bData %16;
hex[0] = (high <10)?('0'+high):('A'+high-10);
hex[1] = (low <10)?('0'+low):('A'+low-10);
}


int getLocalMac(unsigned char *mac) //获取本机MAC址 
{
ULONG ulSize=0;
PIP_ADAPTER_INFO pInfo=NULL;
int temp=0;
temp = GetAdaptersInfo(pInfo,&ulSize);//第一处调用,获取缓冲区大小
pInfo=(PIP_ADAPTER_INFO)malloc(ulSize);
temp = GetAdaptersInfo(pInfo,&ulSize);


int iCount=0;
while(pInfo)//遍历每一张网卡
{
//  pInfo->Address MAC址
for(int i=0;i<(int)pInfo->AddressLength;i++)
{
byte2Hex(pInfo->Address[i],&mac[iCount]);//Address为char型,8位数据转换成两位十进制的字符
iCount+=2;
if(i<(int)pInfo->AddressLength-1)
{
mac[iCount++] = ':';
}else
{
mac[iCount++] = '#';
}
}
pInfo = pInfo->Next;
}


if(iCount >0)
{
mac[--iCount]='\0';//这里把最后一个#用0覆盖了
return iCount;
}
else return -1;
}


void CheckIP(char* ip,int size) //定义CheckIP()函数,用于获取本机IP地址
{
memset(ip,0,size);
WSADATA wsaData;
char name[255];//定义用于存放获得的主机名的变量
//char *ip;//定义IP地址变量
char *tmpip;
PHOSTENT hostinfo;


//调用MAKEWORD()获得Winsock版本的正确值,用于加载Winsock库


if (WSAStartup(MAKEWORD(2,0), &wsaData) == 0) {
//现在是加载Winsock库,如果WSAStartup()函数返回值为0,说明加载成功,程序可以继续
if (gethostname(name, sizeof(name)) == 0) {
//如果成功地将本地主机名存放入由name参数指定的缓冲区中
if ((hostinfo = gethostbyname(name)) != NULL) {
//这是获取主机名,如果获得主机名成功的话,将返回一个指针,指向hostinfo,hostinfo
//为PHOSTENT型的变量,下面即将用到这个结构体
tmpip=inet_ntoa(*(struct in_addr *)*hostinfo->h_addr_list);
memcpy(ip ,tmpip,strlen(tmpip)+1);
//调用inet_ntoa()函数,将hostinfo结构变量中的h_addr_list转化为标准的点分表示的IP
//地址(如192.168.0.1)
//printf("%s\n",ip);//输出IP地址
}
}
WSACleanup(); //卸载Winsock库,并释放所有资源
}
}


//test_harddisk用于检测磁盘
//return 0-6
//0:DRIVE_UNKNOWN "未知磁盘";
//1:DRIVE_NO_ROOT_DIR 无法找到根目录 "磁盘不存在";
//2:DRIVE_REMOVABLE 可移动驱动器 "可移动磁盘";
//3:DRIVE_FIXED 固定磁盘驱动器:本地硬盘或移动硬盘  "本地磁盘";
//4:DRIVE_REMOTE "网络驱动器";
//5:DRIVE_CDROM "CD/DVD_ROM";
//6:DRIVE_RAMDISK "随机存取磁盘";
int test_harddisk(char drive)
{
TCHAR szRoot[4];
int ret=0;
#ifdef UNICODE
swprintf(szRoot,_T("%c:\\"),drive);
#else
sprintf(szRoot,"%c:\\",drive);
#endif
ret = GetDriveType(szRoot);
return ret;
}


void main() 

//获取版本信息
char ver[64];
getSysteminfo(ver,64);
printf("version:%s\n",ver);


//获取cpu信息
char cpu_info[64];
get_cpu_info(cpu_info,64);
printf("cpu info:%s\n",cpu_info);
//获取内存大小
double mem_size;
mem_size=get_phy_mem();
printf("总共物理内存:\t%lf G\r\n",mem_size);


//获取ip  
char this_ip[64];
CheckIP(this_ip,64);
printf("ip:%s\n",this_ip);


//获取mac
unsigned char mac_address[64];
if(getLocalMac(mac_address)>0)
{
printf("mac-%s\n",mac_address);
}else
{
printf("invoke getMAC error!\n");
}


//检测磁盘是否存在
TCHAR szRoot[4];
char test_drive;
int ret=0;
for(int i=0; i<6; i++)  
{  
test_drive = i+'A';
if(test_harddisk(test_drive) == DRIVE_FIXED)
{
printf("硬盘%c存在\n",test_drive);
}
else
printf("硬盘%c,不存在或者非磁盘\n",test_drive);
}
while(1);
}
0 0