【注】本文是参考百度百科对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, 0, 12);
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 }
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, 0, 12);
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
参考文档: