2025年获取CPU型号和序列号

获取CPU型号和序列号主要参考文章 关于 CPU 序列号的问题 以及如何获取 64 下 CPU 的 ProcessorID fudong071234 的博客 CSDN 博客 前几天经过查资料 得到网络上获取 CPU 序列号的方法是错误的 首先我找到了一篇论文 这篇论文里面是这么说的 这篇论文是错误的 这篇是错误的这篇是错误的

大家好,我是讯享网,很高兴认识大家。

主要参考文章:关于CPU序列号的问题,以及如何获取×64下CPU的ProcessorID_fudong071234的博客-CSDN博客前几天经过查资料,得到网络上获取CPU序列号的方法是错误的,首先我找到了一篇论文,这篇论文里面是这么说的:这篇论文是错误的。这篇是错误的这篇是错误的!!!!!!!!!2、CPU序列号CPU序列号是一个建立在处理器内部的、唯一的、不能被修改的编号。它由96位数字组成。高32位是CPUID,用来识别CPU类型。低64位每个处理器都不同,唯一地代表了该处理器。CPU号可以用来识别
讯享网https://blog.csdn.net/fudong071234/article/details/
__cpuid, __cpuidex | Microsoft DocsLearn more about: __cpuid, __cpuidexicon-default.png?t=L892https://docs.microsoft.com/en-us/cpp/intrinsics/cpuid-cpuidex?view=msvc-160之前用的获取CPU型号或者序列号的代码,都是网上找的包含了汇编指令的代码。64位程序里面显然没办法用。参考了上面两篇文章,整理了两个函数做备忘。微软那个下面有例子,但是用到的std::array,这个是c++11的,有时候用vs2008,会编译不过。我稍微改动了下。

代码没有优化和美化,如有需要请自行整理。

获取CPU型号

#include <intrin.h> #include <vector> #include <bitset> #include <string> using namespace std; string GetCpuBrand() { typedef struct tagCpui { tagCpui() { interArray[0] = 0; interArray[1] = 0; interArray[2] = 0; interArray[3] = 0; }; tagCpui& operator=(const tagCpui& value) { interArray[0] = value.interArray[0]; interArray[1] = value.interArray[1]; interArray[2] = value.interArray[2]; interArray[3] = value.interArray[3]; return *this; }; int interArray[4]; }Cpui; int nIds_; int nExIds_; std::string vendor_; std::string brand_; bool isIntel_; bool isAMD_; std::bitset<32> f_1_ECX_; std::bitset<32> f_1_EDX_; std::bitset<32> f_7_EBX_; std::bitset<32> f_7_ECX_; std::bitset<32> f_81_ECX_; std::bitset<32> f_81_EDX_; std::vector<Cpui> data_; std::vector<Cpui> extdata_; Cpui cpui; // Calling __cpuid with 0x0 as the function_id argument // gets the number of the highest valid function ID. __cpuid(cpui.interArray, 0); nIds_ = cpui.interArray[0]; for (int i = 0; i <= nIds_; ++i) { __cpuidex(cpui.interArray, i, 0); data_.push_back(cpui); } // Capture vendor string char vendor[0x20]; memset(vendor, 0, sizeof(vendor)); *reinterpret_cast<int*>(vendor) = data_[0].interArray[1]; *reinterpret_cast<int*>(vendor + 4) = data_[0].interArray[3]; *reinterpret_cast<int*>(vendor + 8) = data_[0].interArray[2]; vendor_ = vendor; if (vendor_ == "GenuineIntel") { isIntel_ = true; } else if (vendor_ == "AuthenticAMD") { isAMD_ = true; } // load bitset with flags for function 0x00000001 if (nIds_ >= 1) { f_1_ECX_ = data_[1].interArray[2]; f_1_EDX_ = data_[1].interArray[3]; } // load bitset with flags for function 0x00000007 if (nIds_ >= 7) { f_7_EBX_ = data_[7].interArray[1]; f_7_ECX_ = data_[7].interArray[2]; } // Calling __cpuid with 0x as the function_id argument // gets the number of the highest valid extended ID. __cpuid(cpui.interArray, 0x); nExIds_ = cpui.interArray[0]; char brand[0x40]; memset(brand, 0, sizeof(brand)); for (int i = 0x; i <= nExIds_; ++i) { __cpuidex(cpui.interArray, i, 0); extdata_.push_back(cpui); } // load bitset with flags for function 0x if (nExIds_ >= 0x) { f_81_ECX_ = extdata_[1].interArray[2]; f_81_EDX_ = extdata_[1].interArray[3]; } // Interpret CPU brand string if reported if (nExIds_ >= 0x) { memcpy(brand, extdata_[2].interArray, sizeof(cpui.interArray)); memcpy(brand + 16, extdata_[3].interArray, sizeof(cpui.interArray)); memcpy(brand + 32, extdata_[4].interArray, sizeof(cpui.interArray)); brand_ = brand; } return brand_; }

讯享网

获取CPU序列号

讯享网#include <intrin.h> #include <string> #include <vector> #include <bitset> string GetCpuIndex() { typedef struct tagCpui { tagCpui() { interArray[0] = 0; interArray[1] = 0; interArray[2] = 0; interArray[3] = 0; }; tagCpui& operator=(const tagCpui& value) { interArray[0] = value.interArray[0]; interArray[1] = value.interArray[1]; interArray[2] = value.interArray[2]; interArray[3] = value.interArray[3]; return *this; }; int interArray[4]; }Cpui; //string strCpuType = GetCPUType(); int nIds_; int nExIds_; std::string vendor_; std::string brand_; bool isIntel_; bool isAMD_; std::bitset<32> f_1_ECX_; std::bitset<32> f_1_EDX_; std::bitset<32> f_7_EBX_; std::bitset<32> f_7_ECX_; std::bitset<32> f_81_ECX_; std::bitset<32> f_81_EDX_; std::vector<Cpui> data_; std::vector<Cpui> extdata_; Cpui cpui; // Calling __cpuid with 0x0 as the function_id argument // gets the number of the highest valid function ID. __cpuid(cpui.interArray, 0); nIds_ = cpui.interArray[0]; for (int i = 0; i <= nIds_; ++i) { __cpuidex(cpui.interArray, i, 0); data_.push_back(cpui); } // Capture vendor string char vendor[0x20]; memset(vendor, 0, sizeof(vendor)); *reinterpret_cast<int*>(vendor) = data_[0].interArray[1]; *reinterpret_cast<int*>(vendor + 4) = data_[0].interArray[3]; *reinterpret_cast<int*>(vendor + 8) = data_[0].interArray[2]; vendor_ = vendor; if (vendor_ == "GenuineIntel") { isIntel_ = true; } else if (vendor_ == "AuthenticAMD") { isAMD_ = true; } char vendor_serialnumber[0x14] = { 0 }; sprintf_s(vendor_serialnumber, sizeof(vendor_serialnumber), "%08X%08X", data_[1].interArray[3], data_[1].interArray[0]); string strRet = vendor_serialnumber; return strRet; }

上述两个函数是在微软那个例子基础上改动的,我在32位程序中测试了,与之前使用汇编的那种代码获取到的结果是一样的。

小讯
上一篇 2025-01-27 19:52
下一篇 2025-02-15 18:35

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/33254.html