#include "StdAfx.h"
#include "cPhysicsInfoUtils.h"
#include <WinSock2.h>
#include <atlbase.h>
#include <atlconv.h>
#include <IPHlpApi.h>
#include <algorithm>
#include <WinIoCtl.h>

#pragma comment(lib, "Iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "netapi32.lib")

cPhysicsInfoUtils::cPhysicsInfoUtils(void)
{
}


cPhysicsInfoUtils::~cPhysicsInfoUtils(void)
{
}

/*//µ÷ÊÔ²»¿ÉÓÃ
BOOL cPhysicsInfoUtils::GetSerialNum(string& pSerialNum)
{
	HANDLE hFile = CreateFile(_T("\\\\.\\PHYSICALDRIVE0"), 0, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
	if (INVALID_HANDLE_VALUE == hFile)
	{
		return FALSE;
	}

	DWORD retn;
	static BYTE buffer[0x1000];
	STORAGE_DEVICE_DESCRIPTOR* descriptor = (STORAGE_DEVICE_DESCRIPTOR*)buffer;
	STORAGE_PROPERTY_QUERY p = {StorageDeviceIdProperty, PropertyStandardQuery};
	if (!DeviceIoControl(hFile, IOCTL_STORAGE_QUERY_PROPERTY, &p, sizeof(p), buffer, sizeof(buffer), &retn, 0))
	{
		return FALSE;
	}

	if (descriptor->SerialNumberOffset > 0)
	{
		char Serial[256];
		BYTE* data;
		data = buffer + descriptor->SerialNumberOffset;
		sprintf_s(Serial, 256, "%s", data);
		string SerialNum = Serial;
		//ɾ³ýÓ²ÅÌÐòÁкÅÁ½¶ËµÄ¿Õ¸ñ
		SerialNum.erase(0, SerialNum.find_first_not_of(" "));
		SerialNum.erase(SerialNum.find_last_not_of(" ") + 1);
		pSerialNum = SerialNum;
	}

	return TRUE;
}
*/

BOOL cPhysicsInfoUtils::GetHardDiskSerial(string& pSerial)
{
	char SerialNumber[1024] = {""};
	memset(&SerialNumber, 0, sizeof(SerialNumber));

	MasterHardDiskSerial a;
	int ret = a.GetSerialNo(SerialNumber);
	if (!ret)
	{
		pSerial = SerialNumber;
	}

	return TRUE;
}

BOOL cPhysicsInfoUtils::GetMAC(string& pMac)
{
	char mac[128];
	string getMac_key;
	PIP_ADAPTER_INFO pAdapterInfo;
	PIP_ADAPTER_INFO pAdapter = NULL;
	DWORD dwRetVal = 0;
	ULONG ulOutBufLen;

	pAdapterInfo = (PIP_ADAPTER_INFO)malloc(sizeof(PIP_ADAPTER_INFO));
	ulOutBufLen = sizeof(PIP_ADAPTER_INFO);
	if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW)
	{
		free(pAdapterInfo);
		pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulOutBufLen);
	}

	if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR)
	{
		pAdapter = pAdapterInfo;
		if (pAdapter)
		{
			sprintf_s(mac, 128, "%02x-%02x-%02x-%02x-%02x-%02x", 
				pAdapter->Address[0], 
				pAdapter->Address[1],
				pAdapter->Address[2],
				pAdapter->Address[3],
				pAdapter->Address[4],
				pAdapter->Address[5]);
			pMac = mac;

			return TRUE;
		}
	}

	return FALSE;
}

BOOL cPhysicsInfoUtils::GetCPU_iD(string& pCPU_iD)
{
	int dwBuf[4];  
	getcpuid((unsigned int *)dwBuf, 1);  
	char pCpuId[32] = "";
	sprintf(pCpuId,"%08X",dwBuf[3]);
	sprintf(pCpuId + 8, "%08X", dwBuf[0]);
	pCPU_iD = pCpuId;

	return TRUE;
}

void cPhysicsInfoUtils::getcpuid(unsigned int *CPUInfo, unsigned int InfoType)
{
	#if defined(__GNUC__)// GCC  
		__cpuid(InfoType, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]);  
	#elif defined(_MSC_VER)// MSVC  
	#if _MSC_VER >= 1400 //VC2005²ÅÖ§³Ö__cpuid  
		__cpuid((int*)(void*)CPUInfo, (int)(InfoType));  
	#else //ÆäËûʹÓÃgetcpuidex  
		getcpuidex(CPUInfo, InfoType, 0);  
	#endif  
	#endif  
}

void cPhysicsInfoUtils::getcpuidex(unsigned int *CPUInfo, unsigned int InfoType, unsigned int ECXValue)
{
	#if defined(_MSC_VER) // MSVC  
	#if defined(_WIN64) // 64λϲ»Ö§³ÖÄÚÁª»ã±à. 1600: VS2010, ¾Ý˵VC2008 SP1Ö®ºó²ÅÖ§³Ö__cpuidex.  
		__cpuidex((int*)(void*)CPUInfo, (int)InfoType, (int)ECXValue);  
	#else  
		if (NULL==CPUInfo)  
			return;  
		_asm{  
			// load. ¶ÁÈ¡²ÎÊýµ½¼Ä´æÆ÷.  
			mov edi, CPUInfo;  
			mov eax, InfoType;  
			mov ecx, ECXValue;  
			// CPUID  
			cpuid;  
			// save. ½«¼Ä´æÆ÷±£´æµ½CPUInfo  
			mov [edi], eax;  
			mov [edi+4], ebx;  
			mov [edi+8], ecx;  
			mov [edi+12], edx;  
		}  
	#endif  
	#endif 
}