Explorar o código

#IQRV #comment [HSPScanner][Merge] module/include

gifur %!s(int64=2) %!d(string=hai) anos
pai
achega
5368785946

+ 752 - 0
Module/include/Other/CSystemStatus.cpp

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

+ 161 - 0
Module/include/Other/CSystemStatus.h

@@ -0,0 +1,161 @@
+#ifndef __CSystemStatus_h__
+#define __CSystemStatus_h__
+#include <vector>
+#include <string>
+ 
+typedef struct
+{
+	std::string _strdir;			//磁盘名称
+	float	_Total;					//磁盘总容量MB
+	float	_OfFree;				//磁盘剩余容量MB
+}EACHDISKSTATUS,*LPEACHDISKSTATUS;
+
+typedef struct
+{
+	std::string Name;				//网卡名称
+	std::string Description;		//网卡描述
+	std::string Local_IP;			//IP地址
+	std::string Local_Mac;			//MAC地址
+}NETCARDINFO,*LPNETCARDINFO;
+
+
+#define SYSSTATE_NONE			0x00000000
+#define SYSSTATE_CPU_USAGE		0x00000001
+#define SYSSTATE_DISK_READ		0x00000002
+#define SYSSTATE_DISK_WRITE		0x00000004
+#define SYSSTATE_NET_DOWNLOAD	0x00000008
+#define SYSSTATE_NET_UPLOAD		0x00000010
+
+typedef struct
+{ 
+	BYTE bVersion; // Binary driver version. 
+	BYTE bRevision; // Binary driver revision. 
+	BYTE bReserved; // Not used. 
+	BYTE bIDEDeviceMap; // Bit map of IDE devices. 
+	DWORD fCapabilities; // Bit mask of driver capabilities. 
+	DWORD dwReserved[4]; // For future use. 
+} GETVERSIONOUTPARAMS, *PGETVERSIONOUTPARAMS, *LPGETVERSIONOUTPARAMS; 
+
+typedef struct
+{ 
+	USHORT wGenConfig; 
+	USHORT wNumCyls; 
+	USHORT wReserved; 
+	USHORT wNumHeads; 
+	USHORT wBytesPerTrack; 
+	USHORT wBytesPerSector; 
+	USHORT wSectorsPerTrack; 
+	USHORT wVendorUnique[3]; 
+	CHAR sSerialNumber[20]; 
+	USHORT wBufferType; 
+	USHORT wBufferSize; 
+	USHORT wECCSize; 
+	CHAR sFirmwareRev[8]; 
+	CHAR sModelNumber[40]; 
+	USHORT wMoreVendorUnique; 
+	USHORT wDoubleWordIO; 
+	USHORT wCapabilities; 
+	USHORT wReserved1; 
+	USHORT wPIOTiming; 
+	USHORT wDMATiming; 
+	USHORT wBS; 
+	USHORT wNumCurrentCyls; 
+	USHORT wNumCurrentHeads; 
+	USHORT wNumCurrentSectorsPerTrack; 
+	ULONG ulCurrentSectorCapacity; 
+	USHORT wMultSectorStuff; 
+	ULONG ulTotalAddressableSectors; 
+	USHORT wSingleWordDMA; 
+	USHORT wMultiWordDMA; 
+	BYTE bReserved[128]; 
+} IDSECTOR, *PIDSECTOR; 
+
+#define DFP_GET_VERSION			0x00074080 
+#define DFP_SEND_DRIVE_COMMAND	0x0007c084 
+#define DFP_RECEIVE_DRIVE_DATA	0x0007c088 
+
+ 
+#include "pdh.h"
+ 
+class CSystemStatus
+{
+public:
+	CSystemStatus();
+	~CSystemStatus();
+public:
+	void		SystemInit(DWORD object = SYSSTATE_CPU_USAGE);							//系统初始化(初始化多个项目时使用或运算连接)
+	void		SystemUnInit();															//释放资源
+	double		GetSystemNetDownloadRate();												//获取网络下载速度
+	double		GetSystemNetUploadRate();												//获取网络上传速度
+	double		GetSystemDiskReadRate();												//获取当前磁盘读速率
+	double		GetSystemDiskWriteRate();												//获取当前磁盘写速率
+	double		GetSystemCpuCurrentUsage();												//系统CPU使用率
+
+	void		GetSystemDiskStatus(std::vector<EACHDISKSTATUS> &vectorDisk);           //获取各个磁盘使用状态
+	void		GetSystemDiskStatus(ULONGLONG& AllDiskTotal, ULONGLONG& AllDiskFree);	//获取系统总得磁盘使用状态
+	void		GetSystemCurrentDiskStatus(ULONGLONG& TatolMB, ULONGLONG& FreeCaller);	//获取当前磁盘使用状态
+	double		GetSystemCurrentDiskUsage();											//获取当前磁盘使用率
+
+	BOOL		GetPhysicalMemoryState(ULONGLONG& totalPhysMem, ULONGLONG& physMemUsed);//获取物理内存状态
+	double		GetTotalPhysicalMemory();												//获取可用内存大小
+	double		GetTotalPhysicalMemoryFree();											//获取空闲内存
+	double		GetTotalPhysicalMemoryUsed();											//获取已使用内存大小
+	double		GetPhysicalMemoryUsage();												//获取内存使用率
+
+	void		GetNetCardInfo(std::vector<NETCARDINFO> &vectorNetCard);				//获取网卡信息
+	void		GetOsInfo(std::string& strOSName, std::string& strOSArch);                                         //获取操作系统信息 
+	void		GetCpuInfo(std::string &CPUinfo);										//获取CPU硬件信息 	
+	void		GetCPUid(std::string &CPUid);											//获取CPUid
+
+	BOOL		GetHDSerial(std::string &HDSerial);										//获取硬盘物理序列号(需要管理员权限)
+private:
+	PDH_HQUERY		m_Query; 
+	PDH_HCOUNTER	m_CpuTotal,m_DiskRead,m_DiskWrite,m_NetDownload,m_NetUpload;
+
+public:
+	/*
+	参数:const char *cmd
+	systeminfo:查看详细的系统信息
+	wmic logicaldisk:查看盘符
+	fsutil volume diskfree + 盘符名称:查看某个盘符的容量大小。
+	wmic path win32_physicalmedia get SerialNumber;查看硬盘系列号
+	wmic diskdrive get serialnumber;查看硬盘系列号(和上面效果一样)
+	wmic cpu:查看CPU运行信息
+	wmic cpu list brief:查看CPU硬件信息
+	wmic memorychip;查看系统内存信息
+	wmic bios:查看系统的bios信息
+	wmic memorychip list brief:查看内存条数
+	wmic memcache list brief:查看缓存内存
+	wmic diskdrive:查看磁盘详细信息
+	wmic diskdrive get Name, Model:查看硬盘名称,型号(使用get)
+	...
+	*/
+	std::string execCmd(const char *cmd)
+	{
+		char buffer[128] = { 0 };
+		std::string result;
+		FILE *pipe = _popen(cmd, "r");
+		if (!pipe) throw std::runtime_error("_popen() failed!");
+		while (!feof(pipe))
+		{
+			if (fgets(buffer, 128, pipe) != NULL)
+				result += buffer;
+		}
+		_pclose(pipe);
+		return result;
+	}
+
+	_inline void ChangeByteOrder(PCHAR szString, USHORT uscStrSize) 
+	{ 
+		USHORT  i	= 0; 
+		CHAR	temp= '\0'; 
+
+		for (i = 0; i < uscStrSize; i+=2) 
+		{ 
+			temp			= szString[i]; 
+			szString[i]		= szString[i+1]; 
+			szString[i+1]	= temp; 
+		} 
+	}
+};
+#endif

+ 17 - 0
Module/include/modVer.h

@@ -0,0 +1,17 @@
+#ifndef MODULE_VERSION_H
+#define MODULE_VERSION_H
+
+#define MODULE_VERSION_MAJOR 0
+#define MODULE_VERSION_MINOR 0
+#define MODULE_VERSION_REVISION 1
+#define MODULE_VERSION_SUFFIX "dev1"
+
+#define MODULE_API_VERSION "0"
+#define MODULE_VERSION "0.0.1"
+
+#ifdef MODULE_VERSION_FULL
+	#undef MODULE_VERSION_FULL
+#endif
+#define MODULE_VERSION_FULL "0.0.1-dev1"
+
+#endif /* MODULE_VERSION_H */