最近項目中想使用CPU,硬盤,網卡的ID進行加密授權驗證,但是CPU的序列號獲取網上都是一些使用內嵌彙編的方式,然後我的是64位程序,微軟不支持內嵌彙編指令,只好研究替代方式了。
進過查找,發現微軟推出了__cpuid和__cpuidex函數替代了彙編指令,於是打算使用。
在網上找到有使用__cpuid獲取廠商,family,CPU名稱的代碼,直接拿來使用了(^~^)。
對於獲取CPU的ID,網上一直沒有找到,後來查看了微軟的官方數據,終於搞明白了使用方式,發上來記錄一下。
char pvendor[16];
INT32 dwBuf[4];
__cpuid(dwBuf, 0);
*(INT32*)&pvendor[0] = dwBuf[1]; // ebx: 前四個字符
*(INT32*)&pvendor[4] = dwBuf[3]; // edx: 中間四個字符
*(INT32*)&pvendor[8] = dwBuf[2]; // ecx: 最後四個字符
pvendor[12] = '\0';
__cpuid(dwBuf, 0x1);
int family = (dwBuf[0] >> 8) & 0xf;
char pbrand[64];
__cpuid(dwBuf, 0x80000000);
if (dwBuf[0] < 0x80000004)
{
return;
}
__cpuid((INT32*)&pbrand[0], 0x80000002); // 前16個字符
__cpuid((INT32*)&pbrand[16], 0x80000003); // 中間16個字符
__cpuid((INT32*)&pbrand[32], 0x80000004); // 最後16個字符
pbrand[48] = '\0';
這是直接在網上找到使用__cpuid獲取廠商信息,family信息和CPU名稱的。
__cpuidex(dwBuf, 1, 1);
char szTmp[33]={NULL};
sprintf(szTmp, "%08X%08X", dwBuf[3], dwBuf[0]);
這是我自己找到獲取CPU的ID的方式。經驗證和使用命令wmic CPU get ProcessorID得到的數據是一致的。
參考:
[1]https://msdn.microsoft.com/en-us/library/hskdteyh(v=vs.90).aspx
[2]http://www.cnblogs.com/zyl910/archive/2012/05/21/vcgetcpuid.html