天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 79|回复: 0

获取CPU的ID

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
#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

 

 

 

 

获取CPU的ID
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 10:31 , Processed in 0.116610 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表