#include "stdafx.h"
#include "CSystemStatus.h"
#include <Shlwapi.h>
#include <windows.h>
#include <string>
#include <Iphlpapi.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;
	//SystemInit();
}
 
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 &osinfo)
{
	// get os name according to version number
	SYSTEM_INFO system_info;
	memset(&system_info,0,sizeof(SYSTEM_INFO));
	GetSystemInfo(&system_info);

	OSVERSIONINFOEX  osver = { sizeof(OSVERSIONINFO) };
	osver.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
	GetVersionEx((OSVERSIONINFO*)&osver);
	std::string os_name;
	if (osver.dwMajorVersion == 4 && osver.dwMinorVersion == 0)
	{
		if(osver.dwPlatformId==VER_PLATFORM_WIN32_NT) 
			os_name="Microsoft Windows NT 4.0 ";             
		else if(osver.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS) 
			os_name="Microsoft Windows 95 "; 
	}
	else if (osver.dwMajorVersion == 4 && osver.dwMinorVersion == 10)
		os_name = "Microsoft Windows 98";
	else if (osver.dwMajorVersion == 4 && osver.dwMinorVersion == 90)
		os_name = "Microsoft Windows Me";
	else if (osver.dwMajorVersion == 5 && osver.dwMinorVersion == 0)
	{
		os_name = "Microsoft Windows 2000";
		if(osver.wSuiteMask==VER_SUITE_ENTERPRISE) 
			os_name+=" Advanced Server "; 
	}
	else if (osver.dwMajorVersion == 5 && osver.dwMinorVersion == 1)
	{
		os_name = "Microsoft Windows XP";

		if(osver.wSuiteMask==VER_SUITE_EMBEDDEDNT) 
			os_name+=" Embedded "; 
		else if(osver.wSuiteMask==VER_SUITE_PERSONAL) 
			os_name+=" Home Edition "; 
		else
			os_name+=" Professional ";
	}
	else if (osver.dwMajorVersion == 5 && osver.dwMinorVersion == 2)
	{
		//os_name = "Microsoft Windows vista";
		if(osver.wProductType==VER_NT_WORKSTATION &&system_info.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
			os_name="Microsoft Windows XP Professional x64 Edition "; 
		if(GetSystemMetrics(SM_SERVERR2)==0 && osver.wSuiteMask==VER_SUITE_BLADE)
			os_name ="Microsoft Windows Server 2003 Web Edition "; 
		else if(GetSystemMetrics(SM_SERVERR2)==0 && osver.wSuiteMask==VER_SUITE_COMPUTE_SERVER) 
			os_name="Microsoft Windows Server 2003 Compute Cluster Edition "; 
		else if(GetSystemMetrics(SM_SERVERR2)==0 &&  osver.wSuiteMask==VER_SUITE_STORAGE_SERVER) 
			os_name="Microsoft Windows Server 2003 Storage Server "; 
		else if(GetSystemMetrics(SM_SERVERR2)==0 &&   osver.wSuiteMask==VER_SUITE_DATACENTER) 
			os_name="Microsoft Windows Server 2003 Datacenter Edition "; 
		else if(GetSystemMetrics(SM_SERVERR2)==0 &&   osver.wSuiteMask==VER_SUITE_ENTERPRISE) 
			os_name="Microsoft Windows Server 2003 Enterprise Edition "; 
		else if(GetSystemMetrics(SM_SERVERR2)!=0 &&   osver.wSuiteMask==VER_SUITE_STORAGE_SERVER)
			os_name="Microsoft Windows Server 2003 R2 Storage Server ";
	}
	else if (osver.dwMajorVersion == 6 && osver.dwMinorVersion == 0)
	{
		//os_name = "Microsoft Windows 2003";

		if(osver.wProductType==VER_NT_WORKSTATION)
		{
			os_name="Microsoft Windows Vista "; 
			if (osver.wSuiteMask==VER_SUITE_PERSONAL)
				os_name+=" Home";
		}				
		else if(osver.wProductType!=VER_NT_WORKSTATION)
		{
			os_name="Microsoft Windows Server 2008 ";
			if ( osver.wSuiteMask==VER_SUITE_DATACENTER)
				os_name+=" Datacenter Server ";
			else if (osver.wSuiteMask==VER_SUITE_ENTERPRISE)
				os_name+=" Enterprise ";
		}
	}
	else if (osver.dwMajorVersion == 6 && osver.dwMinorVersion == 1)
	{
		os_name = "Microsoft Windows 7.0";
		/*if(osver.wProductType==VER_NT_WORKSTATION) 
		os_name="Microsoft Windows 7 "; 
		else
		os_name="Microsoft Windows Server 2008 R2 ";*/ 
	}
	else if (osver.dwMajorVersion == 6 && osver.dwMinorVersion == 2)
	{
		os_name = "Microsoft Windows 8.0";
		/*if (osver.wProductType == VER_NT_WORKSTATION)
		os_name = "Microsoft Windows 8";
		else
		os_name = "Microsoft Windows Server 2012";*/
	}
	else if (osver.dwMajorVersion == 6 && osver.dwMinorVersion == 3)
	{
		os_name = "Microsoft Windows 8.1";
		/*if (osver.wProductType == VER_NT_WORKSTATION)
		os_name = "Microsoft Windows 8.1";
		else
		os_name = "Microsoft Windows Server 2012 R2";*/
	}
	else if (osver.dwMajorVersion == 10 && osver.dwMinorVersion == 0)
	{
		os_name = "Microsoft Windows 10.0";
		/*	if (osver.wProductType == VER_NT_WORKSTATION)
		os_name = "Microsoft Windows 10.0";
		else
		os_name = "Microsoft Windows Server 2016";*/
	}

	SYSTEM_INFO si;
	GetNativeSystemInfo(&si);
	if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||  
		si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 )
		os_name+=" X64";   
	else os_name+= " x86";

	osinfo=os_name;
}

//获取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);
}