最近项目中想使用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';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
这是直接在网上找到使用__cpuid获取厂商信息,family信息和CPU名称的。
__cpuidex(dwBuf, 1, 1);
char szTmp[33]={NULL};
sprintf(szTmp, "%08X%08X", dwBuf[3], dwBuf[0]);
1
2
3
这是我自己找到获取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
————————————————
版权声明:本文为CSDN博主「kestiny」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chlk118/article/details/51218964