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