#include "StdAfx.h" #include "cPhysicsInfoUtils.h" #include #include #include #include #include #include #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 }