C++ 使用Rdmsr和RdmsrTx从感兴趣的MSR中获取温度值

C++ 使用Rdmsr和RdmsrTx从感兴趣的MSR中获取温度值,c++,windows,winapi,cpu,temperature,C++,Windows,Winapi,Cpu,Temperature,看起来它从PCI寄存器中获得了类似的信息。AMD将在某个地方有相应的文档来定义这一点 根据定义,在这两种情况下,硬件如何公开其温度传感器的信息。您可以使用这样的库,它将在幕后完成这项工作,或者您可以编写自己的等效代码 提到的WMI类在最新的Windows 10中不适用于我。 在我的戴尔笔记本电脑上,我可以在这里获得CPU温度,单位为摄氏度: ROOT_CIMV2\Win32_PerfFormattedData_Counters_ThermalZoneInformation\HighPrecisi

看起来它从PCI寄存器中获得了类似的信息。AMD将在某个地方有相应的文档来定义这一点


根据定义,在这两种情况下,硬件如何公开其温度传感器的信息。您可以使用这样的库,它将在幕后完成这项工作,或者您可以编写自己的等效代码

提到的WMI类在最新的Windows 10中不适用于我。 在我的戴尔笔记本电脑上,我可以在这里获得CPU温度,单位为摄氏度:

ROOT_CIMV2\Win32_PerfFormattedData_Counters_ThermalZoneInformation\HighPrecisionTemperature

您是否将您的体温与任何监控软件()进行了比较?开尔文摄氏度换算呢?(注:您可以重用RealTemp或其他项目中的驱动程序)我正在进行转换
(temp/10-273.15)
,但结果总是70.05,核心温度显示不同。您看过吗?可能重复的@Housy不是重复的,因为这个问题肯定是关于通过Windows API进行转换的,而您链接的是关于通过托管代码执行的。从这些文档中,无法从SMBIOS表中提取CurrentReading属性的实时读数。因此,WMI的当前实现不填充CurrentReading属性。由于op正在查找当前的CPU温度,我相信此WMI类需要一个工作的
CurrentReading
属性来完成此工作。这对您有用吗?它对我不起作用,正如computerfreaker所说,根据文档
CurrentReading
没有填充。是的,它起作用。无论如何,它也是在类CIM_TemperatureSensor中实现的,试试看。当我调用
IEnumWbemClassObject::Next()
时,我得到
0x80041010
错误。有人提出过他的建议吗?请注意,
rdmsr
需要一个内核驱动程序,这是用户模式代码无法实现的。
BSTR query = SysAllocString(L"SELECT * FROM MSAcpi_ThermalZoneTemperature");
BSTR query = SysAllocString(L"SELECT * FROM Win32_TemperatureProbe");
BSTR query = SysAllocString(L"SELECT * FROM CIM_TemperatureSensor");
using OpenHardwareMonitor.Hardware;
...
        float? cpu_temperature_celcius = null;
        Computer computer= new Computer();
        computer.CPUEnabled = true;
        computer.Open();
        foreach (IHardware hardware in computer.Hardware)
            if (hardware.HardwareType == HardwareType.CPU)
                foreach (ISensor sensor in hardware.Sensors)
                    if (sensor.SensorType == SensorType.Temperature)
                        cpu_temperature_celcius = sensor.Value;
private const uint IA32_THERM_STATUS_MSR = 0x019C;
private const uint IA32_TEMPERATURE_TARGET = 0x01A2;
private const uint IA32_PERF_STATUS = 0x0198;
private const uint MSR_PLATFORM_INFO = 0xCE;
private const uint IA32_PACKAGE_THERM_STATUS = 0x1B1;
private const uint MSR_RAPL_POWER_UNIT = 0x606;
private const uint MSR_PKG_ENERY_STATUS = 0x611;
private const uint MSR_DRAM_ENERGY_STATUS = 0x619;
private const uint MSR_PP0_ENERY_STATUS = 0x639;
private const uint MSR_PP1_ENERY_STATUS = 0x641;
ROOT_CIMV2\Win32_PerfFormattedData_Counters_ThermalZoneInformation\HighPrecisionTemperature