获取CPU型号和序列号

2021-09-27 15:07:38 浏览数 (1)

主要参考文章:关于CPU序列号的问题,以及如何获取×64下CPU的ProcessorID_fudong071234的博客-CSDN博客前几天经过查资料,得到网络上获取CPU序列号的方法是错误的,首先我找到了一篇论文,这篇论文里面是这么说的:这篇论文是错误的。这篇是错误的这篇是错误的!!!!!!!!!2、CPU序列号CPU序列号是一个建立在处理器内部的、唯一的、不能被修改的编号。它由96位数字组成。高32位是CPUID,用来识别CPU类型。低64位每个处理器都不同,唯一地代表了该处理器。CPU号可以用来识别

https://blog.csdn.net/fudong071234/article/details/49612083__cpuid, __cpuidex | Microsoft DocsLearn more about: __cpuid, __cpuidex

https://docs.microsoft.com/en-us/cpp/intrinsics/cpuid-cpuidex?view=msvc-160之前用的获取CPU型号或者序列号的代码,都是网上找的包含了汇编指令的代码。64位程序里面显然没办法用。参考了上面两篇文章,整理了两个函数做备忘。微软那个下面有例子,但是用到的std::array,这个是c 11的,有时候用vs2008,会编译不过。我稍微改动了下。

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

获取CPU型号

代码语言:javascript复制
#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 0x80000000 as the function_id argument
	// gets the number of the highest valid extended ID.
	__cpuid(cpui.interArray, 0x80000000);
	nExIds_ = cpui.interArray[0];

	char brand[0x40];
	memset(brand, 0, sizeof(brand));

	for (int i = 0x80000000; i <= nExIds_;   i)
	{
		__cpuidex(cpui.interArray, i, 0);
		extdata_.push_back(cpui);
	}

	// load bitset with flags for function 0x80000001
	if (nExIds_ >= 0x80000001)
	{
		f_81_ECX_ = extdata_[1].interArray[2];
		f_81_EDX_ = extdata_[1].interArray[3];
	}

	// Interpret CPU brand string if reported
	if (nExIds_ >= 0x80000004)
	{
		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序列号

代码语言:javascript复制
#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), "XX", data_[1].interArray[3], data_[1].interArray[0]);
	string strRet = vendor_serialnumber;
	return strRet;
}

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

0 人点赞