ManagementClass("Win32_Processor")获取CPUID失败的时候怎么利用WMITools为CPUID赋值

ManagementClass("Win32_Processor")获取CPUID失败的时候怎么利用WMITools为CPUID赋值,第1张

使用ManagementClass("Win32_Processor")获取cpuid失败,代码如下:

ManagementClass mc = new ManagementClass("Win32_Processor");

ManagementObjectCollection moc = mcGetInstances();

foreach (ManagementObject mo in moc)

{

_S_RegsionGUID = moProperties["ProcessorId"]ValueToString();

break;

}

当获取ProcessorId时失败,提示该值为Null,对于有些计算机成功对于有些计算机失败。 查看了一些ManagementClass 相关资料:[NET 框架中的WMI命名空间][WMI介绍及简单应用]解决办法如下:

1、判断出问题出在WMI上;

2、下载WMI管理工具WMIToolsexe,下载地址:>

、推荐使用__cpuid、__cpuidex等Intrinsics函数

32位模式我使用内嵌汇编调用cpuid指令64位模式VC编译器支持内嵌汇编

于微软提供Intrinsics函数——编译器Intrinsics函数编译应机器指令且同支持32位64位

例CPUID指令应Intrinsics函数——

[cpp] view plain copy

//

void __cpuid(

int CPUInfo[4],

int InfoType

);

void __cpuidex(

int CPUInfo[4],

int InfoType,

int ECXValue

);

__cpuidex函数InfoType参数CPUID指令eax参数即功能IDECXValue参数CPUID指令ecx参数即功能IDCPUInfo参数用于接收输eax, ebx, ecx, edx四寄存器

早期CPUID功能需要功能ID参数(eax)使用__cpuid函数

CPUID功能越越强功能ID参数(eax)参数够用于加功能ID(ecx)参数应该采用__cpuidex

二、用条件编译判断VC编译器Intrinsics函数支持性(_MSC_VER)

__cpuid、__cpuidex等Intrinsics函数遇问题——

1低版本VC编译器没intrinh文件注:VC2005(或更高)才拥intrinh支持__cpuid

2低版本VC编译器支持__cpuidex注:VC2008部版本及VS2011(或更高)intrinh才__cpuidex

使用条件编译判断VC编译器版本

_MSC_VER微软C/C++编译器——clexe编译代码预定义宏值表示cl版本类型int例——

#if _MSC_VER >=1200 // VC++60

#if _MSC_VER >=1300 // VC2003

#if _MSC_VER >=1400 // VC2005

#if _MSC_VER >=1500 // VC2008

#if _MSC_VER >=1600 // VC2011

例发现_MSC_VER于等于1400我#include 再利用_MSC_VER进步判断__cpuid、__cpuidex支持性

三、用条件编译判断64位模式(_WIN64)

使用_WIN64预处理宏用判断目标平台64位

虽编译x64平台程序编译器自推导_WIN64Visual Studio语高亮清楚些能仍按32位代码做语高亮所建议手项目预处理宏增加_WIN64

四、32位用内嵌汇编实现__cpuidex函数

32位模式我使用内嵌汇编实现__cpuidex函数代码——

[cpp] view plain copy

void __cpuidex(INT32 CPUInfo[4], INT32 InfoType, INT32 ECXValue)

{

if (NULL==CPUInfo) return;

_asm{

// load 读取参数寄存器

mov edi, CPUInfo; // 准备用edi寻址CPUInfo

mov eax, InfoType;

mov ecx, ECXValue;

// CPUID

cpuid;

// save 寄存器保存CPUInfo

mov [edi], eax;

mov [edi+4], ebx;

mov [edi+8], ecx;

mov [edi+12], edx;

}

}

五、全部代码

全部代码——

[cpp] view plain copy

#include

#include

#include

#if _MSC_VER >=1400 // VC2005才支持intrinh

#include // 所Intrinsics函数

#endif

char szBuf[64];

INT32 dwBuf[4];

#if defined(_WIN64)

// 64位支持内联汇编 应使用__cpuid、__cpuidex等Intrinsics函数

#else

#if _MSC_VER < 1600 // VS2011 据说VC2008 SP1才支持__cpuidex

void __cpuidex(INT32 CPUInfo[4], INT32 InfoType, INT32 ECXValue)

{

if (NULL==CPUInfo) return;

_asm{

// load 读取参数寄存器

mov edi, CPUInfo; // 准备用edi寻址CPUInfo

mov eax, InfoType;

mov ecx, ECXValue;

// CPUID

cpuid;

// save 寄存器保存CPUInfo

mov [edi], eax;

mov [edi+4], ebx;

mov [edi+8], ecx;

mov [edi+12], edx;

}

}

#endif // #if _MSC_VER < 1600 // VS2011 据说VC2008 SP1才支持__cpuidex

#if _MSC_VER < 1400 // VC2005才支持__cpuid

void __cpuid(INT32 CPUInfo[4], INT32 InfoType)

{

__cpuidex(CPUInfo, InfoType, 0);

}

#endif // #if _MSC_VER < 1400 // VC2005才支持__cpuid

#endif // #if defined(_WIN64)

// 取CPU厂商(Vendor)

//

// result: 功返字符串度(般12)失败返0

// pvendor: 接收厂商信息字符串缓冲区至少13字节

int cpu_getvendor(char pvendor)

{

INT32 dwBuf[4];

if (NULL==pvendor) return 0;

// Function 0: Vendor-ID and Largest Standard Function

__cpuid(dwBuf, 0);

// save 保存pvendor

(INT32)&pvendor[0] = dwBuf[1]; // ebx: 前四字符

(INT32)&pvendor[4] = dwBuf[3]; // edx: 间四字符

(INT32)&pvendor[8] = dwBuf[2]; // ecx: 四字符

pvendor[12] = '\0';

return 12;

}

// 取CPU商标(Brand)

//

// result: 功返字符串度(般48)失败返0

// pbrand: 接收商标信息字符串缓冲区至少49字节

int cpu_getbrand(char pbrand)

{

INT32 dwBuf[4];

if (NULL==pbrand) return 0;

// Function 0x80000000: Largest Extended Function Number

__cpuid(dwBuf, 0x80000000);

if (dwBuf[0] < 0x80000004) return 0;

// Function 80000002h,80000003h,80000004h: Processor Brand String

__cpuid((INT32)&pbrand[0], 0x80000002); // 前16字符

__cpuid((INT32)&pbrand[16], 0x80000003); // 间16字符

__cpuid((INT32)&pbrand[32], 0x80000004); // 16字符

pbrand[48] = '\0';

return 48;

}

int _tmain(int argc, _TCHAR argv[])

{

//__cpuidex(dwBuf, 0,0);

//__cpuid(dwBuf, 0);

//printf("%8X\t%8X\t%8X\t%8X\n", dwBuf[0],dwBuf[1],dwBuf[2],dwBuf[3]);

cpu_getvendor(szBuf);

printf("CPU Vendor:\t%s\n", szBuf);

cpu_getbrand(szBuf);

printf("CPU Name:\t%s\n", szBuf);

return 0;

}

六、兼容性说明

VC编译器32/64位支持性——

32位:VC6早支持编译32位Intrinsics函数

64位:VC2005早支持编译64位Intrinsics函数

本文32位编译器兼容性——

__cpuid:兼容VC6(或更高)

__cpuidex:兼容VC6(或更高)

本文64位编译器兼容性——

__cpuid:兼容VC2005(或更高)

__cpuidex:兼容VC2011(或更高)

代码如下(具体看注释):

view plaincopy to clipboardprint

using System;

using SystemManagement;

namespace SoyeeComm

{

/// summary

/// Computer Information

/// /summary

public class Computer

{

public string CpuID;

public string MacAddress;

public string DiskID;

public string IpAddress;

public string LoginUserName;

public string ComputerName;

public string SystemType;

public string TotalPhysicalMemory; //单位:M

private static Computer _instance;

public static Computer Instance()

{

if (_instance == null)

_instance = new Computer();

return _instance;

}

protected Computer()

{

CpuID=GetCpuID();

MacAddress=GetMacAddress();

DiskID=GetDiskID();

IpAddress=GetIPAddress();

LoginUserName=GetUserName();

SystemType=GetSystemType();

TotalPhysicalMemory=GetTotalPhysicalMemory();

ComputerName=GetComputerName();

}

string GetCpuID()

{

try

{

//获取CPU序列号代码

string cpuInfo = ;//cpu序列号

ManagementClass mc = new ManagementClass(Win32_Processor);

ManagementObjectCollection moc = mcGetInstances();

foreach(ManagementObject mo in moc)

{

cpuInfo = moProperties[ProcessorId]ValueToString();

}

moc=null;

mc=null;

return cpuInfo;

}

catch

{

return unknow;

}

finally

{

}

}

string GetMacAddress()

{

try

{

//获取网卡硬件地址

string mac=;

ManagementClass mc = new ManagementClass(Win32_NetworkAdapterConfiguration);

ManagementObjectCollection moc = mcGetInstances();

foreach(ManagementObject mo in moc)

{

if((bool)mo[IPEnabled] == true)

{

mac=mo[MacAddress]ToString();

break;

}

}

moc=null;

mc=null;

return mac;

}

catch

{

return unknow;

}

finally

{

}

}

string GetIPAddress()

{

try

{

//获取IP地址

string st=;

ManagementClass mc = new ManagementClass(Win32_NetworkAdapterConfiguration);

ManagementObjectCollection moc = mcGetInstances();

foreach(ManagementObject mo in moc)

{

if((bool)mo[IPEnabled] == true)

{

//st=mo[IpAddress]ToString();

SystemArray ar;

ar=(SystemArray)(moProperties[IpAddress]Value);

st=arGetValue(0)ToString();

break;

}

}

moc=null;

mc=null;

return st;

}

catch

{

return unknow;

}

finally

{

}

}

string GetDiskID()

{

try

{

//获取硬盘ID

String HDid=;

ManagementClass mc = new ManagementClass(Win32_DiskDrive);

ManagementObjectCollection moc = mcGetInstances();

foreach(ManagementObject mo in moc)

{

HDid = (string)moProperties[Model]Value;

}

moc=null;

mc=null;

return HDid;

}

catch

{

return unknow;

}

finally

{

}

}

/// summary

/// *** 作系统的登录用户名

/// /summary

/// returns/returns

string GetUserName()

{

try

{

string st=;

ManagementClass mc = new ManagementClass(Win32_ComputerSystem);

ManagementObjectCollection moc = mcGetInstances();

foreach(ManagementObject mo in moc)

{

st=mo[UserName]ToString();

}

moc=null;

mc=null;

return st;

}

catch

{

return unknow;

}

finally

{

}

}

/// summary

/// PC类型

/// /summary

/// returns/returns

string GetSystemType()

{

try

{

string st=;

ManagementClass mc = new ManagementClass(Win32_ComputerSystem);

ManagementObjectCollection moc = mcGetInstances();

foreach(ManagementObject mo in moc)

{

st=mo[SystemType]ToString();

}

moc=null;

mc=null;

return st;

}

catch

{

return unknow;

}

finally

{

}

}

/// summary

/// 物理内存

/// /summary

/// returns/returns

string GetTotalPhysicalMemory()

{

try

{

string st=;

ManagementClass mc = new ManagementClass(Win32_ComputerSystem);

ManagementObjectCollection moc = mcGetInstances();

foreach(ManagementObject mo in moc)

1)查看RAM使用情况最简单的方法是通过 /proc/meminfo。这个动态更新的虚拟文件实际上是许多其他内存相关工具(如:free/ps/top)等的组合显示。/proc/meminfo列出了所有你想了解的内存的使用情况。$ cat /proc/meminfo2)free命令是一个快速查看内存使用情况的方法,它是对 /proc/meminfo 收集到的信息的一个概述。3)ps命令可以显示各个进程的内存使用情况、以及更详细的物理内存使用情况和虚拟内存使用情况。你可以使用 “–sort”选项对进程进行排序,例如按RSS进行排序:$ ps aux --sort -rss4)top命令显示了每个进程的内存实时使用率。它提供了所有进程的常驻内存大小、程序总内存大小、共享库大小等的报告。

我的电脑 cpu 想要输入下信息!用什么 方法 最好呢下面由我给你做出详细的cpu输入信息方法介绍!希望对你有帮助!

cpu输入信息方法一

CPU是中央处理单元(Cntral Pocessing

Uit)的缩写,它可以被简称做微处理器(mcroprocessor),不过经常被人们直接称为处理器(processor)。不要因为这些简称而忽视它的作用,cpu是计算机的核心,其重要性好比心脏对于人一样。

实际上,处理器的作用和大脑更相似,因为它负责处理、运算计算机内部的所有数据,而主板芯片组则更像是心脏,它控制着数据的交换。cpu的种类决定了你使用的 *** 作系统 和相应的软件。CPU主要由运算器、控制器、寄存器组和内部总线等构成,是PC的核心,再配上储存器、输入/输出接口和系统总线组成为完整的PC。

CPU的基本结构和功能

CPU主要由运算器、控制器、寄存器组和内部总线等构成。寄存器组用于在指令执行过后存放 *** 作数和中间数据,由运算器完成指令所规定的运算及 *** 作。

cpu输入信息方法二

X86处理器的型号,信息处理器家庭,高速缓存尺寸,时钟速度(频率)和制造商codename 等,存放在处理器的CPU ID寄存器组中。

通过执行CPU ID指令集查询,即可获取处理器的相关信息。CPU ID汇编指令使用使用eax作为输入参数(有时也用到ecx),eax、ebx、ecx、edx作为输出参数。

示例汇编代码如下:

mov eax, 1

cpuid

在C语言中(VC6以上)实现方法为:

32位模式下,可使用内嵌汇编来调用cpuid指令;64位模式下,VC编译器不支持内嵌汇编,此时可使用微软提供的Intrinsics函数,来执行cpuid指令,该函数支持32位和64位,该函数包含在 中。

CPUID指令的对应Intrinsics函数为如下两个:

void __cpuid(

int CPUInfo[4],

int InfoType

);

void __cpuidex(

int CPUInfo[4],

int InfoType,

int ECXValue

);

其中InfoType参数是CPUID指令的eax参数,即功能ID。ECXValue参数是CPUID指令的ecx参数,即子功能ID。CPUInfo参数用于接收输出的eax, ebx, ecx, edx这四个寄存器。

早期的CPUID功能只要一个功能ID参数(eax),这时使用__cpuid函数。后来CPUID的功能扩展,又加了一个子功能ID(ecx)参数,这时用__cpuidex。64位环境下包含 后直接调用两个系统库函数即可。

对32位环境,用内嵌汇编可自定义__cpuidex函数如下:

void __cpuidex(INT32 CPUInfo[4], INT32 InfoType, INT32 ECXValue)

{

if (NULL==CPUInfo) return;

_asm{

// load 读取参数到寄存器

mov edi, CPUInfo; // 准备用edi寻址CPUInfo

mov eax, InfoType;

mov ecx, ECXValue;

// CPUID

cpuid;

// save 将寄存器保存到CPUInfo

mov [edi], eax;

mov [edi+4], ebx;

mov [edi+8], ecx;

mov [edi+12], edx;

}

}

利用系统库函数或是自定义的__cpuid,__cpuidex函数,获取处理器信息的2个示例代码如下:

//取得CPU厂商(Vendor)

// result: 成功时返回字符串的长度(一般为12)。失败时返回0。

// pvendor: 接收厂商信息的字符串缓冲区。至少为13字节。

int cpu_getvendor(char pvendor)

{

INT32 dwBuf[4];

if (NULL==pvendor) return 0;

// Function 0: Vendor-ID and Largest Standard Function

__cpuid(dwBuf, 0);

// save 保存到pvendor

(INT32)&pvendor[0] = dwBuf[1]; // ebx: 前四个字符

(INT32)&pvendor[4] = dwBuf[3]; // edx: 中间四个字符

(INT32)&pvendor[8] = dwBuf[2]; // ecx: 最后四个字符

pvendor[12] = '\0';

return 12;

}

// 取得CPU商标(Brand)

// result: 成功时返回字符串的长度(一般为48)。失败时返回0。

// pbrand: 接收商标信息的字符串缓冲区。至少为49字节。

int cpu_getbrand(char pbrand)

{

INT32 dwBuf[4];

if (NULL==pbrand) return 0;

// Function 0x80000000: Largest Extended Function Number

__cpuid(dwBuf, 0x80000000);

if (dwBuf[0] < 0x80000004) return 0;

// Function 80000002h,80000003h,80000004h: Processor Brand String

__cpuid((INT32)&pbrand[0], 0x80000002); // 前16个字符

__cpuid((INT32)&pbrand[16], 0x80000003); // 中间16个字符

__cpuid((INT32)&pbrand[32], 0x80000004); // 最后16个字符

pbrand[48] = '\0';

return 48;

}

更多CPUID的指令的细节查阅X86处理器公司的技术文件或CPUID规范可获取,这里不一一列举。

最近测试反馈了一个问题,每次重启服务器,我们某个版本的业务系统中的机器码都会改变,导致根据机器码算出来的许可证失效,从而使软件无法使用。 这个问题反馈了有一段时间了,但是本地一直没复现。然后前几天测试说又复现了,马上去看了下测试环境,服务器是一台国产化FT S2500服务器,验证了下,果然如此,马上去看了下关键代码。

这下明白了,它是取的CPU序列号作为机器码。dmidecode的输出中有多个Serial Number,它只取了第一个,恰恰就是Processor Information,也就是我们常说的CPU序列号。

CPU支持过序列号功能,但是被人指责侵犯隐私,所以现在的规范中,CPU完全没有所谓的序列号。

关于CPU序列号,其实还有一段 历史 。在奔腾3中短暂地引入过这个功能,但是后来很快就被移除了。

EAX=3: Processor Serial Number

See also: Pentium III § Controversy about privacy issues(>

以上就是关于ManagementClass("Win32_Processor")获取CPUID失败的时候怎么利用WMITools为CPUID赋值全部的内容,包括:ManagementClass("Win32_Processor")获取CPUID失败的时候怎么利用WMITools为CPUID赋值、获取cpu唯一编号、如何在各个版本的VC及64位下使用CPUID指令等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10174680.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存