|
#include <intrin.h> // 所有Intrinsics函数
//64位程序,微软不支持内嵌汇编指令
//https://blog.csdn.net/chlk118/article/details/51218964
//微软推出了__cpuid和__cpuidex函数替代了汇编指令,获取 __cpuid厂商,family,CPU名称的代码
同一个批次的CPU DeviceID 都是 BFEBFBFF000506E3
所以获取意义不大!!!!!!!!
void GetCPUID()
{
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';
printf("get cpuid=");
printf(pvendor);
printf("\n");
printf(pbrand);
printf("\n");
__cpuidex(dwBuf, 1, 1);
char szTmp[33] = { NULL };
sprintf_s(szTmp, "%08X%08X", dwBuf[3], dwBuf[0]);
printf(szTmp);
printf("\n");
sprintf_s(szTmp, "%08X", family );
printf(szTmp);
}
输出
get cpuid=GenuineIntel
Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz
BFEBFBFF000506E3
00000006
-----------------
//32位
//首先说明,CPU序列号并不是全球唯一的,以Intel为例,其不同型号的CPU序列号肯定不同,但不保证同型号的CPU序列号也各不相同,但据说P3后都是全球唯一的,没有详细考证。
//CPU序列号有一个好处就是非常难以修改,至少目前还没听说。将CPU ID 和MAC id 、硬盘id组合起来生成软件序列号,可以大大增加序列号的安全性。(后两者都可以通过软件方法修改)。
string GetCPUID()
{
char cTemp[128];
string CPUID;
unsigned long s1, s2;
unsigned char vendor_id[] = "------------";
char sel;
sel = '1';
string VernderID;
string MyCpuID, CPUID1, CPUID2;
switch (sel)
{
case '1':
__asm {
xor eax, eax //eax=0:取Vendor信息
cpuid //取cpu id指令,可在Ring3级使用
mov dword ptr vendor_id, ebx
mov dword ptr vendor_id[+4], edx
mov dword ptr vendor_id[+8], ecx
}
VernderID = (char)vendor_id;
VernderID += "-";
__asm {
mov eax, 01h //eax=1:取CPU序列号
xor edx, edx
cpuid
mov s1, edx
mov s2, eax
}
sprintf_s(cTemp, "%08X%08X", s1, s2);
CPUID1 = cTemp;
__asm {
mov eax, 03h
xor ecx, ecx
xor edx, edx
cpuid
mov s1, edx
mov s2, ecx
}
sprintf_s(cTemp, "%08X%08X", s1, s2);
CPUID2 = cTemp;
break;
case '2':
{
__asm {
mov ecx, 119h
rdmsr
or eax, 00200000h
wrmsr
}
}
printf("CPU id is disabled.");
break;
}
MyCpuID = CPUID1 + CPUID2;
CPUID = MyCpuID;
printf(CPUID.c_str());
return CPUID;
}
输出:
BFEBFBFF000506E3
string disk_id()
{
string id;
char Name[MAX_PATH];
DWORD serno;
DWORD length;
DWORD FileFlag;
char FileName[MAX_PATH];
BOOL Ret;
Ret = GetVolumeInformationA("c:\\", Name, MAX_PATH, &serno, &length, &FileFlag, FileName, MAX_PATH);
if (Ret)
{
id = std::to_string(serno);
}
printf("hard Disk id = ");
printf(id.c_str()); printf(" \n ");
return id;
}
输出:
hard Disk id = 681865520 |
|