64位程序獲取CPUID,不使用匯編指令

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章