0

最近项目中想使用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


转自:https://blog.csdn.net/chlk118/article/details/51218964
关闭 返回顶部
联系我们
Copyright © 2011. 聚财吧. All rights reserved.