使用C++窗口的CPU ID

CPU ID using C++ - windows

本文关键字:CPU ID 窗口 C++ 使用      更新时间:2023-10-16

我想用c++获取我的计算机(windows)的CPU Id。

我用这个代码得到它。

它输出的信息类似于:

For InfoType 0
CPUInfo[0] = 0x5
CPUInfo[1] = 0x756e6547
CPUInfo[2] = 0x6c65746e
CPUInfo[3] = 0x49656e69
For InfoType 1
CPUInfo[0] = 0xf31
CPUInfo[1] = 0x20800
CPUInfo[2] = 0x41d
CPUInfo[3] = 0xbfebfbff
For InfoType 2
CPUInfo[0] = 0x605b5001
CPUInfo[1] = 0x0
CPUInfo[2] = 0x0
CPUInfo[3] = 0x7c7040
For InfoType 3
CPUInfo[0] = 0x0
CPUInfo[1] = 0x0
CPUInfo[2] = 0x0
CPUInfo[3] = 0x0
For InfoType 4
CPUInfo[0] = 0x0
CPUInfo[1] = 0x0
CPUInfo[2] = 0x0
CPUInfo[3] = 0x0
For InfoType 5
CPUInfo[0] = 0x40
CPUInfo[1] = 0x40
CPUInfo[2] = 0x0
CPUInfo[3] = 0x0
For InfoType 80000000
CPUInfo[0] = 0x80000008
CPUInfo[1] = 0x0
CPUInfo[2] = 0x0
CPUInfo[3] = 0x0
For InfoType 80000001
CPUInfo[0] = 0x0
CPUInfo[1] = 0x0
CPUInfo[2] = 0x0
CPUInfo[3] = 0x0
For InfoType 80000002
CPUInfo[0] = 0x20202020
CPUInfo[1] = 0x20202020
CPUInfo[2] = 0x20202020
CPUInfo[3] = 0x20202020
For InfoType 80000003
CPUInfo[0] = 0x47202020
CPUInfo[1] = 0x69756e65
CPUInfo[2] = 0x4920656e
CPUInfo[3] = 0x6c65746e
For InfoType 80000004
CPUInfo[0] = 0x20295228
CPUInfo[1] = 0x20555043
CPUInfo[2] = 0x30382e32
CPUInfo[3] = 0x7a4847
For InfoType 80000005
CPUInfo[0] = 0x0
CPUInfo[1] = 0x0
CPUInfo[2] = 0x0
CPUInfo[3] = 0x0
For InfoType 80000006
CPUInfo[0] = 0x0
CPUInfo[1] = 0x0
CPUInfo[2] = 0x4008040
CPUInfo[3] = 0x0
For InfoType 80000007
CPUInfo[0] = 0x0
CPUInfo[1] = 0x0
CPUInfo[2] = 0x0
CPUInfo[3] = 0x0
For InfoType 80000008
CPUInfo[0] = 0x2028
CPUInfo[1] = 0x0
CPUInfo[2] = 0x0
CPUInfo[3] = 0x0

我无法理解这些信息中哪一个是我电脑唯一的CPU Id。

有人能帮我做这件事吗。

您的意思是"序列号"、"谁制造了处理器"还是"标识处理器品牌和型号的字符串"。

序列号:

除非您有Pentium III,否则您没有与CPU关联的"唯一ID"。

英特尔在P3中引入了唯一id(序列号)指令。但在隐私问题引起轩然大波后,他们很快在随后的CPU版本中禁用了该功能。

对于记录,在汇编中执行此功能的指令:

mov eax, 3
cpuid

处理器序列号是eax、edx和ecx连接在一起的

通过将"3"作为第二个参数传递给__cpuid函数,可以实现同样的效果。但除非你有P3,否则它不会工作或返回序列号。

供应商(处理器制造商)

int regs[4] = {0};
char vendor[13];
__cpuid(regs, 0);              // mov eax,0; cpuid
memcpy(vendor, &regs[1], 4);   // copy EBX
memcpy(vendor+4, &regs[3], 4); // copy EDX
memcpy(vendor+8, &regs[2], 4); // copy ECX
vendor[12] = '';
print("My CPU is a %sn", vendor);

在您的情况下,这应该打印"GenuineIntel"。

品牌和型号(品牌字符串)

如果您想要CPUID指令的所有详细信息,包括如何获得CPU的品牌、型号和步进,以及"品牌字符串",如"英特尔(R)酷睿(TM)i7-3770 CPU@3.4GHZ……",您可以在下面的链接中参考英特尔手册。向下滚动文档以查找CPUID的文档。我懒得帮你打字。

http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-2a-manual.pdf

MSVC编译器提供的__cpuid()指令在调用cpuid指令之前将"InfoType"映射到EAX。在该指令返回后,EAX、EBX、ECX和EDX将被复制到传递到此函数的CPUInfo[4]数组中。

您要查看的值是制造商标识符。它对所有英特尔CPU都是一样的——当按照正确的顺序读取时,它实际上只是说"GenuineIntel":

CPUInfo[1] = 0x756e6547 = 'Genu'
CPUInfo[3] = 0x49656e69 = 'ineI'
CPUInfo[2] = 0x6c65746e = 'ntel'

AMD CPU的等价物是"AuthenticAMD"。

有关其他信息,请参阅:http://en.wikipedia.org/wiki/CPUID#EAX.3D0:_Get_vendor_ID——但简而言之,CPUID中没有什么特别独特的地方。

请在此处查看。您需要使用__cpuid。然后你应该根据表格提取信息。