[非原创] 获取CPUID;

    【注】本文是参考百度百科对CPUID指令的介绍而简要写的一个总结;但并不一定所有CPU都能支持获取CPUID;关于CPU序列号的表示可能不同人有不同写法。还有关于CPU缓存的信息的获取,需要根据返回的信息去查一个对照表,看起来不够简洁明了,所以关于CPU缓存信息获取的代码我就不写进去了。

    相关代码如下:

code_getCpuId
  1 // GetCPUID.cpp : Defines the entry point for the console application.
  2 //
  3 
  4 #include "stdafx.h"
  5 #include <string.h>
  6 
  7 typedef unsigned long DWORD;
  8 
  9 #define CI_VENDOR    0x01
 10 #define CI_BRAND    0x02
 11 #define CI_SERIAL    0x04
 12 #define CI_ALL        (CI_VENDOR|CI_BRAND|CI_SERIAL)
 13 
 14 typedef struct _CPUINFO
 15 {
 16     unsigned int nMask;
 17     char szVendor[16];
 18     char szBrand[52];
 19     char szSerial[32];
 20     unsigned char Serial[12];
 21 
 22 } CPUINFO, *LPCPUINFO;
 23 
 24 //获取CPUINFO
 25 void GetCPUInfo(LPCPUINFO lpInfo)
 26 {
 27     DWORD _eax, _ebx, _ecx, _edx;
 28     DWORD i, j;
 29 
 30     if(lpInfo->nMask & CI_VENDOR) //vendor
 31     {        
 32         __asm
 33         {
 34             mov eax, 00h;
 35             cpuid;
 36             mov _ebx, ebx;
 37             mov _ecx, ecx;
 38             mov _edx, edx;
 39         }
 40         memcpy(lpInfo->szVendor,     &_ebx, 4);
 41         memcpy(lpInfo->szVendor + 4&_edx, 4);
 42         memcpy(lpInfo->szVendor + 8&_ecx, 4);
 43         lpInfo->szVendor[12= 0;
 44     }
 45 
 46     if(lpInfo->nMask & CI_BRAND) //brand
 47     {        
 48         for(i=0x80000002, j=0; i<0x80000005++i, ++j)
 49         {
 50             __asm
 51             {
 52                 mov eax, i;
 53                 cpuid;
 54                 mov _eax, eax;
 55                 mov _ebx, ebx;
 56                 mov _ecx, ecx;
 57                 mov _edx, edx;
 58             }
 59             memcpy(lpInfo->szBrand + j*16,    &_eax, 4);
 60             memcpy(lpInfo->szBrand + j*16+4,  &_ebx, 4);
 61             memcpy(lpInfo->szBrand + j*16+8,  &_ecx, 4);
 62             memcpy(lpInfo->szBrand + j*16+12&_edx, 4);
 63         }
 64         lpInfo->szBrand[48= 0;
 65     }
 66 
 67     if(lpInfo->nMask & CI_SERIAL) //serial
 68     {
 69         __asm
 70         {
 71             mov eax, 01h;
 72             xor edx, edx;
 73             cpuid;
 74             mov _eax, eax;
 75             mov _edx, edx;
 76         }
 77         if(_edx & (1<<18)) //
 78         {
 79             memcpy(lpInfo->Serial+8&_eax, 4);
 80             __asm
 81             {
 82                 mov eax, 03h;
 83                 xor ecx, ecx;
 84                 xor edx, edx;
 85                 cpuid;
 86                 mov _ecx, ecx;
 87                 mov _edx, edx;
 88             }
 89             memcpy(lpInfo->Serial, &_ecx, 4);
 90             memcpy(lpInfo->Serial+4&_edx, 4);
 91             sprintf(lpInfo->szSerial, 
 92                 "%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X",
 93                 lpInfo->Serial[0], lpInfo->Serial[1], 
 94                 lpInfo->Serial[2], lpInfo->Serial[3],
 95                 lpInfo->Serial[4], lpInfo->Serial[5],
 96                 lpInfo->Serial[6], lpInfo->Serial[7],
 97                 lpInfo->Serial[8], lpInfo->Serial[9],
 98                 lpInfo->Serial[10], lpInfo->Serial[11]);
 99         }
100         else
101         {
102             memset(lpInfo->Serial, 012);
103             strcpy(lpInfo->szSerial, "null");
104         }
105     }
106 }
107 
108 int main(int argc, char* argv[])
109 {
110     CPUINFO info;
111     info.nMask = CI_ALL;
112     GetCPUInfo(&info);
113     printf("Vendor: %s\n", info.szVendor);
114     printf("Brand:  %s\n", info.szBrand);
115     printf("Serial: %s\n", info.szSerial);
116     return 0;
117 }

    输出如下:

    Vendor: GenuineIntel
    Brand:  Intel(R) Core(TM) i5 CPU       M 430  @ 2.27GHz
    Serial: null

    参考文档:

    CPUID, 百度百科

原文地址:https://www.cnblogs.com/hoodlum1980/p/1799852.html