获取CPUID
来源:互联网 发布:软件代理招商方案 编辑:程序博客网 时间:2024/05/17 06:10
MSDN上有一个获取CPU信息的例子如下:
// cpuid.cpp // processor: x86, x64// Use the __cpuid intrinsic to get information about a CPU#include <stdio.h>#include <string.h>#include <intrin.h>const char* szFeatures[] ={ "x87 FPU On Chip", "Virtual-8086 Mode Enhancement", "Debugging Extensions", "Page Size Extensions", "Time Stamp Counter", "RDMSR and WRMSR Support", "Physical Address Extensions", "Machine Check Exception", "CMPXCHG8B Instruction", "APIC On Chip", "Unknown1", "SYSENTER and SYSEXIT", "Memory Type Range Registers", "PTE Global Bit", "Machine Check Architecture", "Conditional Move/Compare Instruction", "Page Attribute Table", "Page Size Extension", "Processor Serial Number", "CFLUSH Extension", "Unknown2", "Debug Store", "Thermal Monitor and Clock Ctrl", "MMX Technology", "FXSAVE/FXRSTOR", "SSE Extensions", "SSE2 Extensions", "Self Snoop", "Hyper-threading Technology", "Thermal Monitor", "Unknown4", "Pend. Brk. EN."};int main(int argc, char* argv[]){ char CPUString[0x20]; char CPUBrandString[0x40]; int CPUInfo[4] = {-1}; int nSteppingID = 0; int nModel = 0; int nFamily = 0; int nProcessorType = 0; int nExtendedmodel = 0; int nExtendedfamily = 0; int nBrandIndex = 0; int nCLFLUSHcachelinesize = 0; int nAPICPhysicalID = 0; int nFeatureInfo = 0; int nCacheLineSize = 0; int nL2Associativity = 0; int nCacheSizeK = 0; int nRet = 0; unsigned nIds, nExIds, i; bool bSSE3NewInstructions = false; bool bMONITOR_MWAIT = false; bool bCPLQualifiedDebugStore = false; bool bThermalMonitor2 = false; // __cpuid with an InfoType argument of 0 returns the number of // valid Ids in CPUInfo[0] and the CPU identification string in // the other three array elements. The CPU identification string is // not in linear order. The code below arranges the information // in a human readable form. __cpuid(CPUInfo, 0); nIds = CPUInfo[0]; memset(CPUString, 0, sizeof(CPUString)); *((int*)CPUString) = CPUInfo[1]; *((int*)(CPUString+4)) = CPUInfo[3]; *((int*)(CPUString+8)) = CPUInfo[2]; // Get the information associated with each valid Id for (i=0; i<=nIds; ++i) { __cpuid(CPUInfo, i); printf_s("\nFor InfoType %d\n", i); printf_s("CPUInfo[0] = 0x%x\n", CPUInfo[0]); printf_s("CPUInfo[1] = 0x%x\n", CPUInfo[1]); printf_s("CPUInfo[2] = 0x%x\n", CPUInfo[2]); printf_s("CPUInfo[3] = 0x%x\n", CPUInfo[3]); // Interpret CPU feature information. if (i == 1) { nSteppingID = CPUInfo[0] & 0xf; nModel = (CPUInfo[0] >> 4) & 0xf; nFamily = (CPUInfo[0] >> 8) & 0xf; nProcessorType = (CPUInfo[0] >> 12) & 0x3; nExtendedmodel = (CPUInfo[0] >> 16) & 0xf; nExtendedfamily = (CPUInfo[0] >> 20) & 0xff; nBrandIndex = CPUInfo[1] & 0xff; nCLFLUSHcachelinesize = ((CPUInfo[1] >> 8) & 0xff) * 8; nAPICPhysicalID = (CPUInfo[1] >> 24) & 0xff; bSSE3NewInstructions = (CPUInfo[2] & 0x1) || false; bMONITOR_MWAIT = (CPUInfo[2] & 0x8) || false; bCPLQualifiedDebugStore = (CPUInfo[2] & 0x10) || false; bThermalMonitor2 = (CPUInfo[2] & 0x100) || false; nFeatureInfo = CPUInfo[3]; } } // Calling __cpuid with 0x80000000 as the InfoType argument // gets the number of valid extended IDs. __cpuid(CPUInfo, 0x80000000); nExIds = CPUInfo[0]; memset(CPUBrandString, 0, sizeof(CPUBrandString)); // Get the information associated with each extended ID. for (i=0x80000000; i<=nExIds; ++i) { __cpuid(CPUInfo, i); printf_s("\nFor InfoType %x\n", i); printf_s("CPUInfo[0] = 0x%x\n", CPUInfo[0]); printf_s("CPUInfo[1] = 0x%x\n", CPUInfo[1]); printf_s("CPUInfo[2] = 0x%x\n", CPUInfo[2]); printf_s("CPUInfo[3] = 0x%x\n", CPUInfo[3]); // Interpret CPU brand string and cache information. if (i == 0x80000002) memcpy(CPUBrandString, CPUInfo, sizeof(CPUInfo)); else if (i == 0x80000003) memcpy(CPUBrandString + 16, CPUInfo, sizeof(CPUInfo)); else if (i == 0x80000004) memcpy(CPUBrandString + 32, CPUInfo, sizeof(CPUInfo)); else if (i == 0x80000006) { nCacheLineSize = CPUInfo[2] & 0xff; nL2Associativity = (CPUInfo[2] >> 12) & 0xf; nCacheSizeK = (CPUInfo[2] >> 16) & 0xffff; } } // Display all the information in user-friendly format. printf_s("\n\nCPU String: %s\n", CPUString); if (nIds >= 1) { if (nSteppingID) printf_s("Stepping ID = %d\n", nSteppingID); if (nModel) printf_s("Model = %d\n", nModel); if (nFamily) printf_s("Family = %d\n", nFamily); if (nProcessorType) printf_s("Processor Type = %d\n", nProcessorType); if (nExtendedmodel) printf_s("Extended model = %d\n", nExtendedmodel); if (nExtendedfamily) printf_s("Extended family = %d\n", nExtendedfamily); if (nBrandIndex) printf_s("Brand Index = %d\n", nBrandIndex); if (nCLFLUSHcachelinesize) printf_s("CLFLUSH cache line size = %d\n", nCLFLUSHcachelinesize); if (nAPICPhysicalID) printf_s("APIC Physical ID = %d\n", nAPICPhysicalID);if (nFeatureInfo || bSSE3NewInstructions || bMONITOR_MWAIT || bCPLQualifiedDebugStore || bThermalMonitor2) { printf_s("\nThe following features are supported:\n");if (bSSE3NewInstructions)printf_s("\tSSE3 New Instructions\n");if (bMONITOR_MWAIT)printf_s("\tMONITOR/MWAIT\n");if (bCPLQualifiedDebugStore)printf_s("\tCPL Qualified Debug Store\n");if (bThermalMonitor2)printf_s("\tThermal Monitor 2\n"); i = 0; nIds = 1; while (i < (sizeof(szFeatures)/sizeof(const char*))) { if (nFeatureInfo & nIds) { printf_s("\t"); printf_s(szFeatures[i]); printf_s("\n"); } nIds <<= 1; ++i; } } } if (nExIds >= 0x80000004) printf_s("\nCPU Brand String: %s\n", CPUBrandString); if (nExIds >= 0x80000006) { printf_s("Cache Line Size = %d\n", nCacheLineSize); printf_s("L2 Associativity = %d\n", nL2Associativity); printf_s("Cache Size = %dK\n", nCacheSizeK); }return nRet;}
但是这个例子取不到CPUID,通过网上查询相关资料发现可以通过以下方法获取CPUID:
#if _MSC_VER < 1600 // VS2010. 据说VC2008 SP1之后才支持__cpuidexvoid __cpuidex(INT32 CPUInfo[4], INT32 InfoType, INT32 ECXValue){if (NULL==CPUInfo) return;_asm{// load. 读取参数到寄存器mov edi, CPUInfo; // 准备用edi寻址CPUInfomov eax, InfoType;mov ecx, ECXValue;// CPUIDcpuid;// save. 将寄存器保存到CPUInfomov [edi], eax;mov [edi+4], ebx;mov [edi+8], ecx;mov [edi+12], edx;}}#endif // #if _MSC_VER < 1600 // VS2010. 据说VC2008 SP1之后才支持__cpuidexint main(int argc, char* argv[]){printf("\nProcessorID:\n");INT32 dwBuf[4] = {0};__cpuidex(dwBuf, 1, 1);char szTmp[33]={NULL};sprintf(szTmp, "%08X%08X", dwBuf[3], dwBuf[0]);printf("%s\n",szTmp);getchar();return 0;}
例子工程在这里下载http://download.csdn.net/detail/i7thtool/9657992
0 0
- 获取cpuid
- 获取CPUID
- 获取CPUID
- 获取CPUID
- 获取CPUID信息
- 获取CPUID信息
- C#-获取CPUID
- Delphi 获取CPUID和制造商
- Delphi通过汇编获取CPUID
- 通过CPUid获取CPU信息
- 汇编语言程序设计-01:获取cpuid
- lua 获取CPU序列号/cpuid
- CPUID
- CPUID
- 用cpuid指令获取cpu信息
- 用cpuid指令获取cpu信息
- VC获取硬盘序列号 网卡 cpuid bios
- 一个全面获取Intel CPUID的代码
- Activity
- 获取下一天日期
- some functions of matlab used for digital images processing
- shell常用命令
- 找到结构体数组某个属性满足条件的其他属性\或满足属性条件的样本
- 获取CPUID
- 数组(一)------模拟ArrayList
- 免费的各类API接口
- 安卓中状态选择器和颜色选择器的使用
- oracle 11g 导入数据库,表空间超过32G的解决办法
- 六种方式实现hibernate查询,及IDE推荐
- 从数据库A复制数据到数据库B,视图不可用
- mysql工具percona-toolkit之安装
- 差分约束系统详解