c++ - 使用 C++ 的 CPU ID - Windows

标签 c++ c windows

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

我用了this code得到它。

它输出的信息是这样的:

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] = '\0';
print("My CPU is a %s\n", vendor);

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

品牌和型号(BRAND 字符串)

如果您想要 CPUID 指令的所有详细信息,包括如何获取 CPU 的品牌、型号和步进,以及“品牌字符串”,例如“Intel(R) Core (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] 数组。

关于c++ - 使用 C++ 的 CPU ID - Windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21642347/

相关文章:

带有额外空行的 C++ 数据文件

c++ - VC++中的第一次机会异常

c - 为什么这个 OpenMP 代码可以在 Linux 上运行,但不能在 Windows 上运行?

windows - hMailServer 只在第一次回复

windows - Golang、net.TCPConn、SetReadTimeout?

c++ - 为多个列表编写迭代器

c++ - Lua:这会导致段错误吗

c - 获取 C 中变量的二进制表示

c - 插入哈希表

c++ - 为什么我的 Button 看起来像是 1990 年的?