|
@@ -1,752 +0,0 @@
|
|
|
-#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);
|
|
|
-}
|