123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752 |
- #include "stdafx.h"
- #include "CSystemStatus.h"
- #include "SpBase.h"
- #include <Shlwapi.h>
- #include <windows.h>
- #include <string>
- #include <Iphlpapi.h>
- #include <tchar.h>
- #include <atlstr.h>
- #include "WinIoCtl.h"
- #pragma comment(lib,"Iphlpapi.lib")
- #pragma comment(lib, "Pdh.lib")
- #pragma comment(lib, "Shlwapi.lib")
-
-
- CSystemStatus::CSystemStatus()
- {
- m_Query = NULL;
- m_CpuTotal = NULL;
- m_DiskRead = NULL;
- m_DiskWrite= NULL;
- m_NetDownload=NULL;
- m_NetUpload=NULL;
- }
-
- CSystemStatus::~CSystemStatus()
- {
- if (m_CpuTotal){
- PdhRemoveCounter(m_CpuTotal);
- m_CpuTotal = NULL;
- }
- if (m_CpuTotal){
- PdhRemoveCounter(m_CpuTotal);
- m_CpuTotal = NULL;
- }
- if (m_DiskRead){
- PdhRemoveCounter(m_DiskRead);
- m_DiskRead = NULL;
- }
- if (m_DiskWrite){
- PdhRemoveCounter(m_DiskWrite);
- m_DiskWrite = NULL;
- }
- if (m_NetDownload)
- {
- PdhRemoveCounter(m_NetDownload);
- m_NetDownload = NULL;
- }
- if (m_NetUpload)
- {
- PdhRemoveCounter(m_NetUpload);
- m_NetUpload = NULL;
- }
- if(m_Query){
- PdhCloseQuery(m_Query);
- m_Query = NULL;
- }
- //SystemUnInit();
- }
-
- //初始化
- void CSystemStatus::SystemInit(DWORD object)
- {
- PDH_STATUS state;
- state = PdhOpenQuery(NULL, NULL, &m_Query);
- if (object&SYSSTATE_CPU_USAGE) //CPU使用率
- state = PdhAddCounter(m_Query, _T("\\Processor(_Total)\\% Processor Time"), NULL, &m_CpuTotal);
- if (object&SYSSTATE_DISK_READ) //磁盘读速度
- state = PdhAddCounter(m_Query, _T("\\PhysicalDisk(_Total)\\Disk Read Bytes/sec"), NULL, &m_DiskRead);
- if (object&SYSSTATE_DISK_WRITE) //磁盘写速度
- state = PdhAddCounter(m_Query, _T("\\PhysicalDisk(_Total)\\Disk Write Bytes/sec"), NULL, &m_DiskWrite);
- if (object&SYSSTATE_NET_DOWNLOAD)//网络下载速度
- state = PdhAddCounter(m_Query, _T("\\Network Interface(killer E2200 Gigabit Ethernet Controller)\\Bytes Received/sec"), NULL, &m_NetDownload);
- if (object&SYSSTATE_NET_UPLOAD) //网络上传速度
- state = PdhAddCounter(m_Query, _T("\\Network Interface(killer E2200 Gigabit Ethernet Controller)\\Bytes Sent/sec"), NULL, &m_NetUpload);
- state = PdhCollectQueryData(m_Query);
- Sleep(500); //这里要有延时不然结果相当不准确
- state = PdhCollectQueryData(m_Query);
- }
- //获取网络下载速度(K/s)
- double CSystemStatus::GetSystemNetDownloadRate()
- {
- PDH_FMT_COUNTERVALUE counterVal;
- PDH_STATUS lStatus = PdhGetFormattedCounterValue(m_NetDownload, PDH_FMT_DOUBLE, NULL, &counterVal);
- if(ERROR_SUCCESS != lStatus) return -1;
- double dbVal= counterVal.doubleValue;
- double NetDownload = (double)((dbVal/(1024*1.0f)));
- return NetDownload;
- }
- //获取网络上传速度
- double CSystemStatus::GetSystemNetUploadRate()
- {
- PDH_FMT_COUNTERVALUE counterVal;
- PDH_STATUS lStatus = PdhGetFormattedCounterValue(m_NetUpload, PDH_FMT_DOUBLE, NULL, &counterVal);
- if(ERROR_SUCCESS != lStatus) return -1;
- double dbVal= counterVal.doubleValue;
- double NetUpload = (double)((dbVal/(1024*1.0f)));
- return NetUpload;
- }
- //获取系统当前磁盘读速率(K/s)
- double CSystemStatus::GetSystemDiskReadRate()
- {
- PDH_FMT_COUNTERVALUE counterVal;
- PDH_STATUS lStatus = PdhGetFormattedCounterValue(m_DiskRead, PDH_FMT_DOUBLE, NULL, &counterVal);
- if(ERROR_SUCCESS != lStatus) return -1;
- double dbVal= counterVal.doubleValue;
- double dbDiskRead = (double)((dbVal/(1024*1.0f)));
- return dbDiskRead;
- }
- //获取系统当前磁盘写速率
- double CSystemStatus::GetSystemDiskWriteRate()
- {
- PDH_FMT_COUNTERVALUE counterVal;
- PDH_STATUS lStatus = PdhGetFormattedCounterValue(m_DiskWrite, PDH_FMT_DOUBLE, NULL, &counterVal);
- if(ERROR_SUCCESS != lStatus) return -1;
- double dbVal= counterVal.doubleValue;
- double dbDiskWrite = (double)((dbVal/(1024*1.0f)));
- return dbDiskWrite;
- }
- //获取CPU使用值
- double CSystemStatus::GetSystemCpuCurrentUsage()
- {
- PDH_FMT_COUNTERVALUE counterVal;
- // CPU时间,注意必须加上PDH_FMT_NOCAP100参数,否则多核CPU会有问题
- PDH_STATUS lStatus = PdhGetFormattedCounterValue(m_CpuTotal, PDH_FMT_DOUBLE| PDH_FMT_NOCAP100, NULL, &counterVal);
- if(ERROR_SUCCESS != lStatus) return -1;
- return counterVal.doubleValue;//PDH_INVALID_ARGUMENT PDH_INVALID_DATA
- }
-
- //反初始化
- void CSystemStatus::SystemUnInit()
- {
- if (m_CpuTotal){
- PdhRemoveCounter(m_CpuTotal);
- m_CpuTotal = NULL;
- }
- if (m_DiskRead){
- PdhRemoveCounter(m_DiskRead);
- m_DiskRead = NULL;
- }
- if (m_DiskWrite){
- PdhRemoveCounter(m_DiskWrite);
- m_DiskWrite = NULL;
- }
- if (m_NetDownload)
- {
- PdhRemoveCounter(m_NetDownload);
- m_NetDownload = NULL;
- }
- if (m_NetUpload)
- {
- PdhRemoveCounter(m_NetUpload);
- m_NetUpload = NULL;
- }
- if(m_Query){
- PdhCloseQuery(m_Query);
- m_Query = NULL;
- }
- }
- // 获取系统所有硬盘使用情况
- void CSystemStatus::GetSystemDiskStatus(ULONGLONG& AllDiskTotal, ULONGLONG& AllDiskFree)
- {
- int DType = 0;
- int si = 0;
- BOOL bResult = FALSE;
- int DiskCount = 0;
- ULONGLONG nTempTotal = 0;
- ULONGLONG nTempFree = 0;
- ULONGLONG i64FreeBytesToCaller;
- ULONGLONG i64TotalBytes;
- ULONGLONG i64FreeBytes;
- //枚举磁盘数量
- DWORD DiskInfo = GetLogicalDrives();
- while (DiskInfo){
- if (DiskInfo & 1){
- ++DiskCount;
- }
- DiskInfo = DiskInfo >> 1;
- }
- int test = DiskCount;
- int DSLength = GetLogicalDriveStrings(0, NULL);
- TCHAR* DStr = NULL;
- while (!DStr){
- DStr = new TCHAR[DSLength];
- }
- if (NULL == DStr){
- return;
- }
- int nRet = GetLogicalDriveStrings(DSLength, (LPTSTR)DStr);
- //枚举磁盘名称
- for (int i = 0;i < DSLength / 4; i++){
- TCHAR strDisk[3] = {0};
- _stprintf(strDisk, _T("%c:"), DStr[si]);
- DType = GetDriveType(DStr + i * 4);
- bResult = GetDiskFreeSpaceEx(
- strDisk,
- (PULARGE_INTEGER)&i64FreeBytesToCaller,
- (PULARGE_INTEGER)&i64TotalBytes,
- (PULARGE_INTEGER)&i64FreeBytes);
- if (bResult){
- nTempTotal += (ULONGLONG)i64TotalBytes / 1024 / 1024 / 1024;
- nTempFree += (ULONGLONG)i64FreeBytesToCaller / 1024 / 1024 / 1024;
- }
- else{
- OutputDebugString(_T("设备未准备..."));
- }
- si += 4;
- }
- AllDiskTotal = nTempTotal;
- AllDiskFree = nTempFree;
- delete[] DStr;
- }
- // 获取系统各个硬盘使用情况
- void CSystemStatus::GetSystemDiskStatus(std::vector<EACHDISKSTATUS> &vectorDisk)
- {
- int DType = 0;
- int si = 0;
- BOOL bResult = FALSE;
- int DiskCount = 0;
- ULONGLONG nTempTotal = 0;
- ULONGLONG nTempFree = 0;
- ULONGLONG i64FreeBytesToCaller;
- ULONGLONG i64TotalBytes;
- ULONGLONG i64FreeBytes;
- //枚举磁盘数量
- DWORD DiskInfo = GetLogicalDrives();
- while (DiskInfo){
- if (DiskInfo & 1){
- ++DiskCount;
- }
- DiskInfo = DiskInfo >> 1;
- }
- int test = DiskCount;
- int DSLength = GetLogicalDriveStrings(0, NULL);
- TCHAR* DStr = NULL;
- while (!DStr){
- DStr = new TCHAR[DSLength];
- }
- if (NULL == DStr){
- return;
- }
- int nRet = GetLogicalDriveStrings(DSLength, (LPTSTR)DStr);
- EACHDISKSTATUS diskstatus;
- //枚举磁盘名称
- for (int i = 0;i < DSLength / 4; i++){
- TCHAR strDisk[3] = {0};
- _stprintf(strDisk, _T("%c:"), DStr[si]);
- DType = GetDriveType(DStr + i * 4);
- bResult = GetDiskFreeSpaceEx(
- strDisk,
- (PULARGE_INTEGER)&i64FreeBytesToCaller,
- (PULARGE_INTEGER)&i64TotalBytes,
- (PULARGE_INTEGER)&i64FreeBytes);
- if (bResult)
- {
- diskstatus._strdir=strDisk[0];
- double total = ((i64TotalBytes / 1024 / 1024) * 100)/ 1024;
- diskstatus._Total=total/100.0f;
- double OfFree = ((i64FreeBytesToCaller / 1024 / 1024) * 100)/ 1024;
- diskstatus._OfFree=OfFree/100.0f;
- vectorDisk.push_back(diskstatus);
- }
- else
- {
- OutputDebugString(_T("设备未准备..."));
- }
- si += 4;
- }
- delete[] DStr;
- }
- //获取系统当前磁盘状态
- void CSystemStatus::GetSystemCurrentDiskStatus(ULONGLONG& TatolMB, ULONGLONG& FreeCaller)
- {
- BOOL bResult = FALSE;
- ULONGLONG nTempTotal = 0;
- ULONGLONG nTempFree = 0;
- ULONGLONG ui64FreeBytesToCaller;
- ULONGLONG ui64TotalBytes;
- ULONGLONG ui64FreeBytes;
- TCHAR szModule[MAX_PATH*2] = {0};
- GetModuleFileName(NULL, szModule, MAX_PATH*2);
- #ifdef _UNICODE
- wstring strPath(szModule);
- wstring strDirve = strPath.substr(0, 1);
- #else
- std::string strPath(szModule);
- std::string strDirve = strPath.substr(0, 1);
- #endif
- TCHAR szDisk[3] = {0};
- _stprintf(szDisk, _T("%c:"), strDirve[0]);
- bResult = GetDiskFreeSpaceEx(
- szDisk,
- (PULARGE_INTEGER)&ui64FreeBytesToCaller, //用户可用的磁盘空间
- (PULARGE_INTEGER)&ui64TotalBytes, //磁盘总共的空间
- (PULARGE_INTEGER)&ui64FreeBytes); //磁盘空闲的空间.以上都是字节为单位。
- if (bResult){
- nTempTotal = ui64TotalBytes / 1024 / 1024 / 1024;
- nTempFree = ui64FreeBytesToCaller / 1024 / 1024 / 1024;
- TatolMB = nTempTotal;
- FreeCaller = nTempFree;
- }
- }
- //获取系统当前磁盘使用率
- double CSystemStatus::GetSystemCurrentDiskUsage()
- {
- BOOL bResult = FALSE;
- ULONGLONG ui64FreeBytesToCaller;
- ULONGLONG ui64TotalBytes;
- ULONGLONG ui64FreeBytes;
- TCHAR szModule[MAX_PATH*2] = {0};
- GetModuleFileName(NULL, szModule, MAX_PATH*2);
- ::PathRemoveFileSpec(szModule);
- #ifdef _UNICODE
- wstring strPath(szModule);
- wstring strDirve = strPath.substr(0, 1);
- #else
- std::string strPath(szModule);
- std::string strDirve = strPath.substr(0, 1);
- #endif
- TCHAR szDisk[3] = {0};
- _stprintf(szDisk, _T("%c:"), strDirve[0]);
- bResult = GetDiskFreeSpaceEx(
- szDisk,
- (PULARGE_INTEGER)&ui64FreeBytesToCaller, //用户可用的磁盘空间
- (PULARGE_INTEGER)&ui64TotalBytes, //磁盘总共的空间
- (PULARGE_INTEGER)&ui64FreeBytes); //磁盘空闲的空间.以上都是字节为单位。
- if (bResult){
- double TempNum = ((ui64TotalBytes / 1024 / 1024 / 1024)-(ui64FreeBytesToCaller/ 1024 / 1024 / 1024))* 100.0 / (ui64TotalBytes/ 1024 / 1024 / 1024);
- return TempNum;
- }
- return 0;
- }
-
- //物理内存和使用
- BOOL CSystemStatus::GetPhysicalMemoryState(ULONGLONG& totalPhysMem, ULONGLONG& physMemUsed)
- {
- MEMORYSTATUSEX memInfo;
- memInfo.dwLength = sizeof(MEMORYSTATUSEX);
- GlobalMemoryStatusEx(&memInfo);
- totalPhysMem = memInfo.ullTotalPhys;
- physMemUsed = memInfo.ullTotalPhys - memInfo.ullAvailPhys;
- return TRUE;
- }
-
- //机器物理内存容量(总可用内存)
- double CSystemStatus::GetTotalPhysicalMemory()
- {
- MEMORYSTATUSEX memInfo;
- memInfo.dwLength = sizeof(MEMORYSTATUSEX);
- GlobalMemoryStatusEx(&memInfo);
- double totalPhysMem = ((memInfo.ullTotalPhys / 1024 / 1024) * 100)/ 1024;
- double fTemptotal = totalPhysMem / 100.0;
- return fTemptotal;
- }
- //机器物理内存容量(空闲内存)
- double CSystemStatus::GetTotalPhysicalMemoryFree()
- {
- MEMORYSTATUSEX memInfo;
- memInfo.dwLength = sizeof(MEMORYSTATUSEX);
- GlobalMemoryStatusEx(&memInfo);
- double physMemFree = (((memInfo.ullAvailPhys) / 1024 / 1024) * 100) / 1024;;
- double fTemMemFree = physMemFree / 100.0;
- return fTemMemFree;
- }
-
- //机器物理内存使用(已使用内存)
- double CSystemStatus::GetTotalPhysicalMemoryUsed()
- {
- MEMORYSTATUSEX memInfo;
- memInfo.dwLength = sizeof(MEMORYSTATUSEX);
- GlobalMemoryStatusEx(&memInfo);
- double physMemUsed = (((memInfo.ullTotalPhys - memInfo.ullAvailPhys) / 1024 / 1024) * 100) / 1024;;
- double fTemMemUsed = physMemUsed / 100.0;
- return fTemMemUsed;
- }
-
- //机器物理内存使用率
- double CSystemStatus::GetPhysicalMemoryUsage()
- {
- MEMORYSTATUSEX memInfo;
- memInfo.dwLength = sizeof(MEMORYSTATUSEX);
- GlobalMemoryStatusEx(&memInfo);
- double MemUsage = memInfo.dwMemoryLoad;
- return MemUsage;
- }
- //获取网卡信息(在获取网速时需要用到网卡描述)
- void CSystemStatus::GetNetCardInfo(std::vector<NETCARDINFO> &vectorNetCard)
- {
- NETCARDINFO NetCardInfo;
- PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
- //得到结构体大小,用于GetAdaptersInfo参数
- unsigned long stSize = sizeof(IP_ADAPTER_INFO);
- //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量
- int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
- //记录网卡数量
- int netCardNum = 0;
- //记录每张网卡上的IP地址数量
- int IPnumPerNetCard = 0;
- if (ERROR_BUFFER_OVERFLOW == nRel)
- {
- //如果函数返回的是ERROR_BUFFER_OVERFLOW
- //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小
- //这也是说明为什么stSize既是一个输入量也是一个输出量
- //释放原来的内存空间
- delete pIpAdapterInfo;
- //重新申请内存空间用来存储所有网卡信息
- pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
- //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
- nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);
- }
- if (ERROR_SUCCESS == nRel)
- {
- //输出网卡信息
- //可能有多网卡,因此通过循环去判断
- while (pIpAdapterInfo)
- {
- ++netCardNum; //网卡数量
- NetCardInfo.Name=pIpAdapterInfo->AdapterName; //网卡名称
- NetCardInfo.Description=pIpAdapterInfo->Description;//网卡描述
-
- switch(pIpAdapterInfo->Type)//网卡类型
- {
- case MIB_IF_TYPE_OTHER:break;
- case MIB_IF_TYPE_ETHERNET:break;
- case MIB_IF_TYPE_TOKENRING:break;
- case MIB_IF_TYPE_FDDI:break;
- case MIB_IF_TYPE_PPP:break;
- case MIB_IF_TYPE_LOOPBACK:break;
- case MIB_IF_TYPE_SLIP:break;
- }
- //网卡MAC地址
- char tempchar[4];
- for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)
- if (i < pIpAdapterInfo->AddressLength-1)
- {
- printf("%02X-", pIpAdapterInfo->Address[i]);
-
- sprintf(tempchar,"%02X-",pIpAdapterInfo->Address[i]);
- NetCardInfo.Local_Mac+=tempchar;
-
- }
- else
- {
- printf("%02X", pIpAdapterInfo->Address[i]);
-
- sprintf(tempchar,"%02X",pIpAdapterInfo->Address[i]);
- NetCardInfo.Local_Mac+=tempchar;
-
- }
-
- //网卡IP地址
- //可能网卡有多IP,因此通过循环去判断
- IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);
- do
- {
- //cout<<"该网卡上的IP数量:"<<++IPnumPerNetCard<<endl;
- //cout<<"IP 地址:"<<pIpAddrString->IpAddress.String<<endl;
- //cout<<"子网地址:"<<pIpAddrString->IpMask.String<<endl;
- //cout<<"网关地址:"<<pIpAdapterInfo->GatewayList.IpAddress.String<<endl;
- NetCardInfo.Local_IP=pIpAddrString->IpAddress.String;
- pIpAddrString=pIpAddrString->Next;
- } while (pIpAddrString);
- vectorNetCard.push_back(NetCardInfo);
- pIpAdapterInfo = pIpAdapterInfo->Next;
- }
- }
- if (pIpAdapterInfo)
- {
- delete pIpAdapterInfo;
- pIpAdapterInfo=NULL;
- }
- }
- //获取操作系统信息
- void CSystemStatus::GetOsInfo(std::string& strOSName, std::string& strOSArch)
- {
- // get os name according to version number
- OSVERSIONINFOEX osvi;
- SYSTEM_INFO si;
- /** 因受系统限制,该接口获取的操作系统版本从8.1开始不对 Gifur@2023724]*/
- ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
- osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
- GetVersionEx((LPOSVERSIONINFO)&osvi);
- ZeroMemory(&si, sizeof(SYSTEM_INFO));
- GetSystemInfo(&si);
- strOSName = "Unknown";
- if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
- {
- if(osvi.dwPlatformId==VER_PLATFORM_WIN32_NT)
- strOSName="Microsoft Windows NT 4.0 ";
- else if(osvi.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS)
- strOSName="Microsoft Windows 95 ";
- }
- else if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
- strOSName = "Microsoft Windows 98";
- else if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)
- strOSName = "Microsoft Windows Me";
- else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0)
- {
- strOSName = "Microsoft Windows 2000";
- if(osvi.wSuiteMask==VER_SUITE_ENTERPRISE)
- strOSName += " Advanced Server ";
- }
- else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1)
- {
- strOSName = "Microsoft Windows XP";
- if(osvi.wSuiteMask==VER_SUITE_EMBEDDEDNT)
- strOSName+=" Embedded ";
- else if(osvi.wSuiteMask==VER_SUITE_PERSONAL)
- strOSName+=" Home Edition ";
- else
- strOSName+=" Professional ";
- }
- else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2)
- {
- if(osvi.wProductType==VER_NT_WORKSTATION &&si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
- strOSName="Microsoft Windows XP Professional x64 Edition ";
- if(GetSystemMetrics(SM_SERVERR2)==0 && osvi.wSuiteMask==VER_SUITE_BLADE)
- strOSName ="Microsoft Windows Server 2003 Web Edition ";
- else if(GetSystemMetrics(SM_SERVERR2)==0 && osvi.wSuiteMask==VER_SUITE_COMPUTE_SERVER)
- strOSName="Microsoft Windows Server 2003 Compute Cluster Edition ";
- else if(GetSystemMetrics(SM_SERVERR2)==0 && osvi.wSuiteMask==VER_SUITE_STORAGE_SERVER)
- strOSName="Microsoft Windows Server 2003 Storage Server ";
- else if(GetSystemMetrics(SM_SERVERR2)==0 && osvi.wSuiteMask==VER_SUITE_DATACENTER)
- strOSName="Microsoft Windows Server 2003 Datacenter Edition ";
- else if(GetSystemMetrics(SM_SERVERR2)==0 && osvi.wSuiteMask==VER_SUITE_ENTERPRISE)
- strOSName="Microsoft Windows Server 2003 Enterprise Edition ";
- else if(GetSystemMetrics(SM_SERVERR2)!=0 && osvi.wSuiteMask==VER_SUITE_STORAGE_SERVER)
- strOSName="Microsoft Windows Server 2003 R2 Storage Server ";
- }
- else if (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0)
- {
- if(osvi.wProductType==VER_NT_WORKSTATION)
- {
- strOSName="Microsoft Windows Vista ";
- if (osvi.wSuiteMask==VER_SUITE_PERSONAL)
- strOSName+=" Home";
- }
- else if (osvi.wProductType != VER_NT_WORKSTATION) {
- strOSName = "Microsoft Windows Server 2008 ";
- if (osvi.wSuiteMask == VER_SUITE_DATACENTER)
- strOSName += " Datacenter Server ";
- else if (osvi.wSuiteMask == VER_SUITE_ENTERPRISE)
- strOSName += " Enterprise ";
- }
- }
- else if (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 1)
- {
- strOSName = "Microsoft Windows 7.0";
- }
- else if (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 2)
- {
- strOSName = "Microsoft Windows 8.0";
- }
- else if (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 3)
- {
- strOSName = "Microsoft Windows 8.1";
- }
- else if (osvi.dwMajorVersion == 10 && osvi.dwMinorVersion == 0)
- {
- strOSName = "Microsoft Windows 10.0";
- }
- SYSTEM_INFO sie;
- ZeroMemory(&sie, sizeof(SYSTEM_INFO));
- GetNativeSystemInfo(&sie);
- strOSArch = "Unknown";
- if (sie.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||
- sie.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64) {
- strOSArch = "x64";
- } else {
- strOSArch = "x86";
- }
- }
- //获取CPU硬件信息
- void CSystemStatus::GetCpuInfo(std::string &CPUinfo)
- {
- int cpuInfo[4] = {-1};
- char cpu_manufacture[32] = { 0 };
- char cpu_type[32] = { 0 };
- char cpu_freq[32] = { 0 };
- __cpuid(cpuInfo, 0x80000002);
- memcpy(cpu_manufacture, cpuInfo, sizeof(cpuInfo));
- __cpuid(cpuInfo, 0x80000003);
- memcpy(cpu_type, cpuInfo, sizeof(cpuInfo));
- __cpuid(cpuInfo, 0x80000004);
- memcpy(cpu_freq, cpuInfo, sizeof(cpuInfo));
- std::string manufacture=cpu_manufacture;//制造商
- std::string type=cpu_type; //型号
- std::string freq=cpu_freq; //频率
- CPUinfo=manufacture+type+freq;
- }
- //获取CPUid
- void CSystemStatus::GetCPUid(std::string &CPUid)
- {
- unsigned long s1,s2,s3,s4;
- __asm
- {
- mov eax,00h
- xor edx,edx
- cpuid
- mov s1, edx
- mov s2, eax
- }
- __asm
- {
- mov eax,01h
- xor ecx,ecx
- xor edx,edx
- cpuid
- mov s3, edx
- mov s4, ecx
- }
- CString st;
- st.Format("%08X%08X%08X%08X",s1,s2,s3,s4);
- CPUid=st.GetBuffer(0);
- st.ReleaseBuffer();
- }
- BOOL CSystemStatus::GetHDSerial(std::string &HDSerial)
- {
- BOOL bRtn = FALSE;
- DWORD bytesRtn = 0;
- char szhd[80] = {0};
- PIDSECTOR phdinfo;
- HANDLE hDrive = NULL;
- GETVERSIONOUTPARAMS vers;
- SENDCMDINPARAMS in;
- SENDCMDOUTPARAMS out;
- ZeroMemory(&vers, sizeof(vers));
- ZeroMemory(&in , sizeof(in));
- ZeroMemory(&out , sizeof(out));
- //搜索四个物理硬盘,取第一个有数据的物理硬盘
- for (int j=0; j<4; j++)
- {
- sprintf(szhd, "\\\\.\\PhysicalDrive%d",j);
- hDrive = CreateFileA(szhd,
- GENERIC_READ|GENERIC_WRITE,
- FILE_SHARE_READ|FILE_SHARE_WRITE,
- 0,
- OPEN_EXISTING,
- 0,
- 0);
- if (NULL == hDrive)continue;
-
- if (!DeviceIoControl(hDrive, DFP_GET_VERSION, 0, 0, &vers, sizeof(vers), &bytesRtn,0))goto FOREND;
- //If IDE identify command not supported, fails
- if (!(vers.fCapabilities&1))goto FOREND;
- //Identify the IDE drives
- if (j&1)in.irDriveRegs.bDriveHeadReg = 0xb0;
- else in.irDriveRegs.bDriveHeadReg = 0xa0;
-
- if (vers.fCapabilities&(16>>j))goto FOREND; //We don't detect a ATAPI device.
- else in.irDriveRegs.bCommandReg = 0xec;
-
- in.bDriveNumber = j;
- in.irDriveRegs.bSectorCountReg = 1;
- in.irDriveRegs.bSectorNumberReg = 1;
- in.cBufferSize = 512;
- if (!DeviceIoControl(hDrive, DFP_RECEIVE_DRIVE_DATA, &in, sizeof(in), &out, sizeof(out), &bytesRtn,0))
- {
- //"DeviceIoControl failed:DFP_RECEIVE_DRIVE_DATA"<<endl;
- goto FOREND;
- }
- phdinfo=(PIDSECTOR)out.bBuffer;
- char s[21] = {0};
- memcpy(s, phdinfo->sSerialNumber, 20);
- s[20] = 0;
- ChangeByteOrder(s, 20);
- //删除空格字符
- int ix = 0;
- for (ix=0; ix<20; ix++)
- {
- if (s[ix] == ' ')continue;
- break;
- }
- char lpszHD[128]={0};
- memcpy(lpszHD, s+ix, 20);
- HDSerial=lpszHD;
- bRtn = TRUE;
- if (bRtn)break;
- FOREND:
- CloseHandle(hDrive);
- hDrive = NULL;
- }
- CloseHandle(hDrive);
- hDrive = NULL;
- return(bRtn);
- }
|