精华内容
下载资源
问答
  • 通过C/C++代码实现获取计算机硬盘和cpu的实时温度
  • 从驱动 层用c++ 获取cpu 温度

    千次阅读 2013-05-31 19:57:33
    获取cpu温度可以通过汇编指令来读取,这里以intel cpu为例,用rdmsr指令读取 IA32_THERM_STATUS_MSR(0x019C)的值,然后用TjunctionMax 减去这个值就是当前cpu的温度,对于一般的intel cpu 的TjunctionMax值是...

    要获取cpu的温度可以通过汇编指令来读取,这里以intel cpu为例,用rdmsr指令读取 IA32_THERM_STATUS_MSR(0x019C)的值,然后用TjunctionMax 减去这个值就是当前cpu的温度,对于一般的intel cpu 的TjunctionMax值是固定的,比如我的cpu是Intel Core 2 (45nm),在官网上可以查到其值是100摄氏度,到后面的intel cpu专门有个寄存器IA32_TEMPERATURE_TARGET(0x01A2)保存TjunctionMax的值,可以通过rdmsr指令读取。但是rdmsr指令只能在Ring0层运行,在运用层是执行不了的,必须通过驱动的方式才能执行,在驱动层专门有个函数__readmsr负责读取类似IA32_THERM_STATUS_MSR(0x019C)

    IA32_TEMPERATURE_TARGET特殊寄存器的值,所以只要在驱动层写好调用程序后在上层用DeviceIoControl函数就可读取这些特殊寄存器的值,信号别人已经写好了现有的驱动(驱动名 WinRing0.sys),你只要在你的程序里面加载这个驱动然后就可读取这些寄存器的值,获得intel cpu的温度。

    其中在上层读取这些寄存器的主要代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    BOOL WINAPI Rdmsr(DWORD index, PDWORD eax, PDWORD edx)
    {
        if(gHandle == INVALID_HANDLE_VALUE)
        {
            return FALSE;
        }
        if(eax == NULL || edx == NULL || gIsMsr == FALSE)
        {
            return FALSE;
        }
        DWORD   returnedLength = 0;
        BOOL    result = FALSE;
        BYTE    outBuf[8] = {0};
        result = DeviceIoControl(
            gHandle,
            IOCTL_OLS_READ_MSR,
            &index,
            sizeof(index),
            &outBuf,
            sizeof(outBuf),
            &returnedLength,
            NULL
            );
        if(result)
        {
            memcpy(eax, outBuf, 4);
            memcpy(edx, outBuf + 4, 4);
        }
        if(result)
        {
            return TRUE;
        }
        else
        {
            return FALSE;
        }
    }

    如果是多核cpu可以通过 SetThreadAffinityMask函数切换cpu来获取每个核的温度代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    void   CCPUTemperatureDlg :: OnTimer ( UINT_PTR   nIDEvent )
    {
        
    CEdit   * edit =( CEdit *) GetDlgItem ( IDC_EDIT1 );
        
    CEdit   * edit1 =( CEdit *) GetDlgItem ( IDC_EDIT2 );
        
    DWORD   eax = 0 , edx = 0 ;
        
    ULONG   result ;
        
    char   s [ 20 ];
        
    result = SetThreadAffinityMask ( GetCurrentThread (), 1 );
        
    Rdmsr ( 0x19c ,& eax ,& edx ); //read Temperature
         SetThreadAffinityMask ( GetCurrentThread (), result );
        
    sprintf ( s , "%d" , 100 -(( eax & 0x007f0000 )>> 16 ));
        
    edit -> SetWindowText ( s );
        
    result = SetThreadAffinityMask ( GetCurrentThread (), 2 );
        
    Rdmsr ( 0x19c ,& eax ,& edx ); //read Temperature
         SetThreadAffinityMask ( GetCurrentThread (), result );
        
    sprintf ( s , "%d" , 100 -(( eax & 0x007f0000 )>> 16 ));
        
    edit1 -> SetWindowText ( s );
        
    CDialog :: OnTimer ( nIDEvent );
    }

    下面是读取结果图:


    程序的下载地址 http://download.csdn.net/detail/xiaibiancheng/5491513

    win7系统运行时要以管理员的方式运行,不然驱动不能加载,还有杀毒软件也会阻止驱动的加载

    展开全文
  • 用C/C++获取CPU温度总结(一)

    万次阅读 2015-02-16 23:21:59
    最近在研究怎样获取CPU温度,网上也有一些办法,但都不算完整,没有清晰的解决方案,现在把我的方法完整的说一下,其实是很简单的东西,没有什么很复杂的。有些地方班门弄斧,各位大侠多多担待。。因为我用的是...

    最近在研究怎样获取CPU的温度,网上也有一些办法,但都不算完整,没有清晰的解决方案,现在把我的方法完整的说一下,其实是很简单的东西,没有什么很复杂的。因为我用的是Intel的CPU,所以只做了Intel的,APU的没办法测试,感兴趣的可以研究。

    Intel从Core Duo处理器开始,每一个物理核心都有一个温度传感器(DTS-Digital Thermal Sensor)用来获取核心温度,这是Intel推荐的获取温度的方法,因为DTS处在每个物理核心温度最高的位置。这个传感器的温度值是通过MSR寄存器来获得的。MSR的相关信息可以参考Intel developer's manual第3卷第35章。在我的下载里面有Intel的manual。

    通过DTS获取温度并不是直接得到CPU的实际温度,而是两个温度的差。第一个叫做Tjmax,这个Intel叫TCC activation temperature,意思是当CPU温度达到或超过这个值时,就会触发相关的温度控制电路,系统此时会采取必要的动作来降低CPU的温度,或者直接重启或关机。所以CPU的温度永远不会超过这个值。这个值一般是100℃或85℃(也有其他值),对于具体的处理器来说就是一个固定的值。第二个就是DTS获取的CPU温度相对Tjmax的偏移值,暂且叫Toffset,那CPU的实际温度就是:currentTemp=Tjmax - Toffset。

    这两个温度值都是通过MSR来获得,获得MSR寄存器中的值用汇编指令rdmsr,Tjmax值相关的MSR的Signature是1A2H,执行

    mov ecx, 0x1A2

    rdmsr

    后,eax中16~23位就是Tjmax的值。

    同理,Toffset值相关的MSR的Signature是19CH,执行

    mov ecx, 0x19C

    rdmsr

    后,eax中16~22(注意这里是7位)位就是Toffset的值。

    问题在于,rdmsr指令需要ring0权限,而Windows下应用程序的权限都是ring3,所以如果在C中直接build-in汇编执行,程序立即停止工作。

    在网上搜索了怎样获取CPU的ring0权限,可惜没有找到相关的代码。这时我参考了Open Hardware Monitor这个软件,Open Hardware Monitor是用C sharp写的,可以检测各个硬件的温度和频率等,可惜我不懂C#代码。但在里面找到了WinRing0.sys,WinRing0也是开源的,看到它的实现之后大吃一惊,里面直接提供rdmsr指令的C函数,已经帮你绕过了Windows的重重城墙。

    所以直接调用Rdmsr()函数就可以了,没有其它。当然要具体了解Winring0是怎样获得ring0权限的,可以直接看它的代码。

    在执行MSR读取时,要先用CPUID判断处理器是否支持DTS,最近的处理器都是支持的。具体是CPUID.06H:EAX[bit0]是否被置位。置1时就是可以的。

    另外,我的是处理器是4核,每个物理核心都应该对应一个温度,可我只获得了一个。跟Open Hardware Monitor对比之后,这个值总是4个核心中最小的那个,怎样获得4个核心加一个package的温度,还需要再研究。无聊还跟鲁大娘对比了一下,大娘不太靠谱,在我的处理器上低了大概10度。CPU负载突然变大时,温度会瞬间提高,大娘基本没反应。

    网上还有另处一种方法我觉得是可行的,是读PMU值,端口号是68H和6CH,同样是绕过Windows来获得ring0权限,用的是WinI/O,不过我没有试。

    还有一种方法说是用WMI,CSDN里面也有相关内容,但这个是哄人的,光一个架子,得不到数据。原因是WMI是通过SMBios来读DMI信息的,微软在做WMI时可能参考了SMBios协议,认为硬件厂商会往DMI里面写信息,但“任性”的硬件厂商并没有这么做。因此所有传感器数据都是NULL。但WMI在获取其它硬件信息时还是很方便的。

    以上的方法适用与Windows。 Linux下不需要所谓ring0,因为在linux下我们有root,我们怕谁。

    提到的相关的Open Hardware Monitor,Winring0,WinI/O,都在我的下载里面。最后提供一张Console里面程序的运行画面。


    展开全文
  • CPU温度获取.rar

    2019-07-16 11:04:32
    在windows环境下使用c/c++获取cpu温度相关代码及总结文档。
  • 通过C/C++代码实现获取计算机硬盘和cpu的实时温度
  • 获取cpu温度

    千次阅读 2018-05-21 13:11:50
    /// @brief 最大GPU温度传感器数量 #ifndef MAX_GPU_SENSORS_NUMBER #define MAX_GPU_SENSORS_NUMBER 16 #endif int GetCoreTemp() { bool bRet = false; unsigned int cpuCoreNum = 0; unsigned int gpuCoreNum...

    这是一个Windows下的硬件扫描和测试工具

    ht---tps://---github.c---om/BurnellLiu/BLHWScaner

    将CoreTemp目录cp到项目目录下,

    将WinRing0/release 目录下所有文件cp到你项目输出目录,

    这个是参照CoreTempTester下main.cpp写的

    #include "stdafx.h"
    #include <stdlib.h>
    #include <iostream>
    
    #include "CoreTemp/LCpuTemp.h" 
    //#include "CoreTemp/LGpuTemp.h"
    #include "CoreTemp\DebugPrint.h"
    //#include "define.h"
    /// @brief 最大处理器物理核心数
    #ifndef MAX_PROCESSOR_PHYSICAL_CORE_NUM
    #define MAX_PROCESSOR_PHYSICAL_CORE_NUM 64
    #endif
    
    /// @brief 最大GPU温度传感器数量
    #ifndef MAX_GPU_SENSORS_NUMBER
    #define MAX_GPU_SENSORS_NUMBER 16
    #endif
    
    int GetCoreTemp()
    {
    	bool bRet = false;
    	unsigned int cpuCoreNum = 0;
    	unsigned int gpuCoreNum = 0;
    	unsigned int cpuTemp[MAX_PROCESSOR_PHYSICAL_CORE_NUM] = { 0 };
    	unsigned int gpuTemp[MAX_GPU_SENSORS_NUMBER] = { 0 };
    	wstring winRing0Path = L"WinRing0.dll";
    	LCpuTemp * gCpuTemp = new LCpuTemp(winRing0Path);
    	bRet = gCpuTemp->Get(cpuCoreNum, cpuTemp);
    	unsigned int averTemp = 0;			//平均值
    	if (!bRet)
    	{
    		DebugPrint("GetCpuTemp Fail\n");
    	}
    	else
    	{
    		DebugPrint("Cpu Core Num Is: %u\n", cpuCoreNum);
    		
    		for (unsigned int i = 0; i < cpuCoreNum; i++)
    		{
    			DebugPrint("Cpu Core(%u) Temp Is: %u\n", i, cpuTemp[i]);
    			averTemp += cpuTemp[i];
    		}
    	}
    	return averTemp/2;
    }

    nvapi.lib 静态链接库总是提示错误 :连接错误

    LGpuTemp.cpp文件下修改

    #pragma comment(lib, "nvapi.lib")

    //#pragma comment(lib, ".\\nvapi\\nvapi.lib")

    在解决方案右键添加现有项 添加nvapi.lib

    结果:


    使用OpenHardwarMonitor 的结果为:



    展开全文
  • 获取CPU温度(总结)

    热门讨论 2014-07-10 08:57:03
    2. 最重要的是参考Intel手册通过读取MSR来读取DTS(Digital Thermal Senser)的值来获取CPU温度 3. 大概讲述了通过WMI,Win32_TemperatureProbe Class,以及WinIO的方式 4. 资源包中包括:Win32_TemperatureProbe ...
  • CPU温度是通过 rsmgr,硬盘温度是通过WMI,可以拿来研究
  • 本人通过VB编程从WMI获取CPU温度,但却是静止不动的,有高手说是必须在某些系统信息发生改变时才会刷新数据。但打开SPEEDFAN温度检测后,WMI里的CPU温度数据却动态地刷新着。并且是准确地。所以在这请教高手解释这...
  • 获取CPU温度和硬盘,32位或64位Intel的CPU都可以用,通过加载WINRING0驱动读取寄存器获得温度,
  • 可以通过读取如下路径中的数据来获取cpu温度信息,不过读取的数据没有经过处理。 cpu0: cat /sys/class/thermal/thermal_zone0/temp cpu1: cat /sys/class/thermal/thermal_zone1/temp 通过命令行的...

    直接读取系统信息

    可以通过读取如下路径中的数据来获取cpu的温度信息,不过读取的数据没有经过处理。

    cpu0:
    cat /sys/class/thermal/thermal_zone0/temp
    cpu1:
    cat /sys/class/thermal/thermal_zone1/temp

    通过命令行的方式获取

    • 安装 lm_sensors 软件包:
    # rpm
    yum install lm_sensors
    
    # deb
    apt-get install lm-sensors
    • 执行命令sensors-detect,进行简单配置,此命令执行后会出现一系列选项,一直yes即可;

    • 执行命令sensors,查看cpu的温度。





    转载于:https://www.cnblogs.com/chuckzhang/p/a067ec85c5037a6d03a56fb443e88494.html

    展开全文
  • 获取硬盘和CPU温度,cpu如何读取硬盘数据,C,C++源码
  • 最近有软件需求要获取CPU 温度等硬件参数,WMI 研究了几天没有找到方法,最后在网上找到openHardwareMonitor 可以实现。 我最初参考是以下网站:https://www.cnblogs.com/chen110xi/p/6189499.html 不过里边的代码...
  • 温度读取vc++获取cpu温度

    千次阅读 2013-06-01 20:44:00
     要获得cpu温度可以通过汇编指令来读取,这里以intel cpu为例,用rdmsr指令读取 IA32_THERM_STATUS_MSR(0x019C)的值,然后用TjunctionMax 减去这个值就是当前cpu温度,对于一般的intel cpu 的Tjuncti...
  • 用驱动获取cpu温度

    千次下载 热门讨论 2013-05-31 20:01:54
    用驱动获取cpu温度,针对intel的cpu
  • linux获取CPU温度

    2014-06-08 12:29:00
    Centos系列   1 ...也可以通过sys系统读取cpu温度: /sys/class/hwmon/hwmon0/device/ 参考:http://www.mjmwired.net/kernel/Documentation/thermal/sysfs-api.txt
  • 压缩包中为WinRing0相关源代码,及已编译好的dll动态库,支持Win32和x64平台下获取CPU温度获取及cpuid相关操作。
  • 通过WMI 获取 CPU 温度

    千次阅读 2016-08-04 21:52:30
    WMI C++ Application Examples // WmiLean.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include #include #include #include #pragma comment...
  • win系统cpu温度获取

    千次阅读 2019-07-10 08:53:41
    基于win 系统的cpu温度获取,用底层驱动来读取cpu温度寄存器的数值,注意,一般网上用到的WMI方式是无法获取cpu温度等信息的,这涉及到win系统的权限,而且,WMI是从BIOS主板上来读取数据的,基本上生产商不会把cpu...
  • #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/sysinfo.h> //#include <...typedef struct CPU_PACKED { char name[20]; unsigned int...
  • 程序中获取NvidiaGPU、CPU温度方法 程序中获取NvidiaGPU、CPU温度方法 1.使用tegrastats命令可得到系统相关信息。 2.取出CPU关键值来。 tegrastats |grep -Eo 'CPU@[0-9][0-9]\.[0-9]|CPU@[0-9][0-9]'![在这里插入...
  • CPU核心温度获取

    千次阅读 2015-12-24 15:09:56
    最近在研究怎样获取CPU温度,网上也有一些办法,但都不算完整,没有清晰的解决方案,现在把我的方法完整的说一下,其实是很简单的东西,没有什么很复杂的。有些地方班门弄斧,各位大侠多多担待。因为我用的是Intel...
  • 新建一个名为cpu-temp.c文件,文件的具体内容如下: [code="c"] #include #include #include #include #include #define TEMP_PATH "/sys/class/thermal/thermal_zone0/temp" ...
  • pi 1468 0.0 0.2 4276 1848 pts/0 S+ 21:57 0:00 grep --color=auto cpu.py kill -s 9 2389 可以杀掉进程 检查是否已经上传:vim curl_yeelink.sh #!/bin/bash curl --request GET --...
  • 网上copy的,类似鲁大师等软件,显示电脑板卡类型,cpu/gpu/硬盘温度等信息的软件。 主程序是用qt做的界面。主机的硬盘温度不一定能获取到,但是拓展硬盘可以获取到。
  • 步一:新建一个名为“cpu-temp.c”的文件,在文件中敲入以下代码: #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> ...
  • CPU温度读取.rar

    2019-07-16 12:11:20
    在windows环境下,使用vs工具实现主流CPU温度的读取。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,607
精华内容 642
关键字:

c++获取cpu温度

c++ 订阅