You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

160 lines
3.7 KiB
C++

#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
}