基于win 系统的cpu温度获取,用底层驱动来读取cpu温度寄存器的数值,注意,一般网上用到的WMI方式是无法获取cpu温度等信息的,这涉及到win系统的权限,而且,WMI是从BIOS主板上来读取数据的,基本上生产商不会把cpu温度,显卡温度等信息写入BIOS 中,而且写入的还是一个固定值,也就是说,cpu温度不会变,本人也尝试了很多方法,最后得出结论,只用通过底层去驱动才能时刻读取cpu温度的准确信息,现将代码和,文件直接贴出来以供大家学习和研究,,注意本文是在VS上编辑运行的 需要自己下载WinRing0.sys 。WinRing0x64.sys。WinRing0x64.dll 。WinRing0x64.dll 系统权限访问库

文件:Ring0.h

#pragma once

#include<Windows.h>
#include <tchar.h>
#include<stdio.h>

/接口定义/

//Ring0Driver.cpp
BOOL Start();
VOID End();

//Ring0Apis.cpp
BOOL WINAPI Rdmsr(DWORD index, PDWORD eax, PDWORD edx);
BOOL WINAPI RdmsrTx(DWORD index, PDWORD eax, PDWORD edx, DWORD_PTR threadAffinityMask);
BOOL WINAPI RdmsrPx(DWORD index, PDWORD eax, PDWORD edx, DWORD_PTR processAffinityMask);

文件: Ring0.cpp
// Ring0.cpp : 定义控制台应用程序的入口点。
//

#include"Ring0.h"

/*
读取基准温度 IA32_TEMPERATURE_TARGET
Rdmsr(IA32_TEMPERATURE_TARGET, &eax, &edx);
int Target = (eax >> 16) & 0xFF;
读取核心温度 IA32_THERM_STATUS_MSR
Rdmsr(IA32_THERM_STATUS_MSR, &eax, &edx, nCore);
调校温度差
int deltaT = 100;
if ((eax & 0x80000000) != 0)deltaT = ((eax & 0x007F0000) >> 16);
//实时温度值
int coreTemperatures = Target - deltaT;
*/
const UINT IA32_THERM_STATUS_MSR = 0x019C;
const UINT IA32_TEMPERATURE_TARGET = 0x01A2;
const UINT IA32_PACKAGE_THERM_STATUS = 0x1B1;

inline UINT GetCoreTemperature(UINT nCore)
{
DWORD eax = 0, edx = 0, Target = 0;
Rdmsr(IA32_TEMPERATURE_TARGET, &eax, &edx);
Target = (eax >> 16) & 0xFF;
RdmsrPx(IA32_THERM_STATUS_MSR, &eax, &edx, nCore);
return (eax & 0x80000000) ? Target - ((eax & 0x007F0000) >> 16) : Target;
}

BOOL __stdcall Handler(DWORD ctrlType)
{
switch (ctrlType)
{
case CTRL_CLOSE_EVENT:End(); break;
default:
break;
}
return TRUE;
}
int _tmain(int argc, _TCHAR* argv[])
{
SetConsoleCtrlHandler(Handler, TRUE);
Start();
for (int i = 0; i < 100; ++i)
{
printf_s(“Core1: %d\nCore2: %d”, GetCoreTemperature(1), GetCoreTemperature(2));
Sleep(500);
system(“cls”);
}
End();
system(“pause”);
return 0;
}

文件 :Ring0Driver.cpp

#include"Ring0.h"

/管理驱动/
//安装驱动
BOOL InstallDriver(LPCTSTR DriverId, LPCTSTR DriverPath)
{
SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
SC_HANDLE hService = CreateService(hSCManager,
DriverId, DriverId,
SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,
DriverPath,
0,0,0,0,0);
CloseServiceHandle(hSCManager);
if (NULL == hService)
if (ERROR_SERVICE_EXISTS != GetLastError())return FALSE;
CloseServiceHandle(hService);
return TRUE;
}
//卸载驱动
BOOL RemoveDriver(LPCTSTR DriverId)
{
SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
SC_HANDLE hService = OpenService(hSCManager, DriverId, SERVICE_ALL_ACCESS);
if (NULL == hService)return TRUE;
BOOL bCode = DeleteService(hService);
CloseServiceHandle(hService);
CloseServiceHandle(hSCManager);
return bCode;
}
//启动驱动
BOOL StartDriver(LPCTSTR DriverId)
{
SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
SC_HANDLE hService = OpenService(hSCManager, DriverId, SERVICE_ALL_ACCESS);
if (0 == hService) return FALSE;
if (!StartService(hService, 0, NULL))
if (ERROR_SERVICE_ALREADY_RUNNING != GetLastError())
{
CloseServiceHandle(hService);
return FALSE;
}
CloseServiceHandle(hService);
return TRUE;
}
//停止驱动
BOOL StopDriver(LPCTSTR DriverId)
{
SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
SC_HANDLE hService = OpenService(hSCManager, DriverId, SERVICE_ALL_ACCESS);
if (0 == hService)return FALSE;
SERVICE_STATUS serviceStatus;
BOOL bCode = ControlService(hService, SERVICE_CONTROL_STOP, &serviceStatus);
CloseServiceHandle(hService);
return bCode;
}
//打开驱动获取设备句柄
BOOL OpenDriver(LPHANDLE lpDriver)
{
if (0 == lpDriver)return FALSE;
*lpDriver = CreateFile(
_T("\\.\WinRing0_1_2_0"),
GENERIC_READ | GENERIC_WRITE,
0,0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
return (INVALID_HANDLE_VALUE == *lpDriver) ? FALSE : TRUE;
}
/下面是主要接口/

//驱动服务ID和显示名称
LPCTSTR DRIVER_ID = _T(“WinRing0_1_2_0”);
//设备句柄
HANDLE hDriver = INVALID_HANDLE_VALUE;

//驱动版本兼顾32系统位和64位系统
LPCTSTR DRIVER_NAME = _T(“WinRing0x64.sys”);
VOID IsWow64()
{
typedef BOOL(WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
LPFN_ISWOW64PROCESS fnIsWow64Process;
BOOL bIsWow64 = FALSE;
fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle(_T(“kernel32”)), “IsWow64Process”);
if (NULL != fnIsWow64Process)
fnIsWow64Process(GetCurrentProcess(), &bIsWow64);

if (bIsWow64)DRIVER_NAME = _T("WinRing0x64.sys");
else DRIVER_NAME = _T("WinRing0.sys");

}

#include<stdio.h>

BOOL Start()
{
BOOL bResult = TRUE;
bResult = RemoveDriver(DRIVER_ID);
TCHAR lpDirectory[256];
GetCurrentDirectory(256, lpDirectory);
IsWow64();
//驱动路径 兼容Unicode和MBCS
#ifdef UNICODE
wsprintf(lpDirectory, _T("%s\%s"), lpDirectory, DRIVER_NAME);
#else
sprintf_s(lpDirectory, _T("%s\%s"), lpDirectory, DRIVER_NAME);
#endif
bResult = InstallDriver(DRIVER_ID, lpDirectory);
if (!bResult)return FALSE;
bResult = StartDriver(DRIVER_ID);
if (!bResult)return FALSE;
bResult = OpenDriver(&hDriver);
if (!bResult)return FALSE;

return TRUE;

}
//终止
VOID End()
{
CloseHandle(hDriver);
StopDriver(DRIVER_ID);
RemoveDriver(DRIVER_ID);
}

文件:Ring0Apis.cpp

#include"Ring0.h"

/设备IO/

//设备句柄
extern HANDLE hDriver;

#define OLS_TYPE 40000
#define IOCTL_OLS_READ_MSR CTL_CODE(OLS_TYPE, 0x821, METHOD_BUFFERED, FILE_ANY_ACCESS)
//读取MSR寄存器 不限制线程
BOOL WINAPI Rdmsr(DWORD index, PDWORD eax, PDWORD edx)
{
if (INVALID_HANDLE_VALUE == hDriver)return FALSE;
BYTE outBuffer[8] = { 0 };
DWORD dwReturnLength = 0;
if (DeviceIoControl(
hDriver,
IOCTL_OLS_READ_MSR,
&index,
sizeof(index),
&outBuffer,
sizeof(outBuffer),
&dwReturnLength,
0))
{
memcpy(eax, outBuffer, 4);
memcpy(edx, outBuffer + 4, 4);
return TRUE;
}
return FALSE;
}
//限制线程
BOOL WINAPI RdmsrTx(DWORD index, PDWORD eax, PDWORD edx, DWORD_PTR threadAffinityMask)
{
DWORD_PTR mask = SetThreadAffinityMask(GetCurrentThread(), threadAffinityMask);
BOOL bResult = Rdmsr(index, eax, edx);
SetThreadAffinityMask(GetCurrentThread(), mask);
return bResult;
}
//限制进程
BOOL WINAPI RdmsrPx(DWORD index, PDWORD eax, PDWORD edx, DWORD_PTR processAffinityMask)
{
DWORD_PTR mask = SetThreadAffinityMask(GetCurrentThread(), processAffinityMask);
BOOL bResult = Rdmsr(index, eax, edx);
SetThreadAffinityMask(GetCurrentThread(), mask);
return bResult;
}

win系统cpu温度获取相关推荐

  1. 黑苹果 CPU温度获取 (这个有问题 谨慎安装)

    黑苹果CPU温度获取 1,安装HWSensors 2,重启系统 1,安装HWSensors HWSensors.6.26.1440.Binaries.dmg.zip下载 Clover Configur ...

  2. 苹果笔记本电脑运行win系统时温度过高解决办法

    如果大家用的是MacBook Pro系列的笔记本电脑,特别是在Win系统下,一定都会遇到温度过高的问题吧,特别是在运行网络游戏.AE.AutoCAD等大软件时,这个问题尤为突出.但如果在很多搜索网站搜 ...

  3. linux系统cpu温度监控,用软件lm_sensors监测Linux系统和CPU温度

    用软件lm_sensors监测Linux系统和CPU温度来源:互联网 作者:佚名 时间:09-08 17:03:29 [大 中 小] 点评:lm_sensors的软件可以帮助我们来监控主板,CPU的工 ...

  4. linux系统cpu温度监控,怎么看cpu温度-ZABBIX监控Linux主机CPU温度

    Linux主机安装Im_sensors [root@localhost ~]# yum install -y lm-sensors [root@localhost ~]# sensors-detect ...

  5. linux 查看cpu_看看你的嵌入式设备CPU温度是多少,能烤肉吗?

    点击上方「嵌入式大杂烩」,「星标公众号」第一时间查看嵌入式笔记! 大家应该都看过一些大佬发的电脑CPU烤肉的视频,电脑CPU的温度真的有那么高吗?我们一起来看一下咱们电脑CPU的温度是多少? PC端C ...

  6. 嵌入式Linux跑分软件,看看你的嵌入式设备CPU温度是多少,能烤肉吗?

    点击上方「嵌入式大杂烩」,「星标公众号」第一时间查看嵌入式笔记! 大家应该都看过一些大佬发的电脑CPU烤肉的视频,电脑CPU的温度真的有那么高吗?我们一起来看一下咱们电脑CPU的温度是多少? PC端C ...

  7. Linux系统获取CPU温度

    Linux系统获取CPU温度 摘自:https://jingyan.baidu.com/article/cbf0e500407d072eab289343.html 各位好,本篇将简单介绍如何在不同系列 ...

  8. BMC通过PECI接口获取CPU温度实现方法

    本文转载于网络,侵权删. PECI是用于监测CPU及芯片组温度的一线总线(one-wirebus),全称是Platform Environment Control Interface.它最主要的应用是 ...

  9. python获取cpu温度_如何获得树莓派CPU实时温度值

    [前言] 任何的电子设备在工作过程中必定会产生发热的现象,而不控制好设备的温度的话,很有可能会损坏设备,或者照成设备的性能下降,本文将通过学习如何读取树莓派CPU温度值,方便后期对树莓派做一些相应的控 ...

最新文章

  1. Java各类型变量之间的转换
  2. 判断手势_手势密码有几种?
  3. 404 为什么是 404?
  4. Silverlight的诸多效果(小鸟飞,白云走,气球飘,图片展示)附源码
  5. 【SQLServer】将Job运行结果发送电子邮件通知用户
  6. unity3 学习localPosition, Position区别,itween插件,计算距离
  7. WebView load**方法 加载资源【总结】
  8. alienfx无法与计算机,戴尔G3无法检测到AlienFX设备怎么办
  9. Editormd的使用——在线编辑和查看文章
  10. 用C语言打印九九乘法表
  11. shell输出毫秒_Shell获取毫秒时间
  12. 硬件设计4---什么是电感磁珠?
  13. 数据集分享 | IWR1642呼吸心跳数据集
  14. 浙大计算机城市学院联合培养,浙大城市学院 今日视点 城市学院2007届联合培养硕士研究生顺利毕业...
  15. 超市管理系统用例建模
  16. android电视如何打开adb调试模式,分享解密某Android电视adb后门方法
  17. java 手动垃圾回收_java如何进行垃圾回收的
  18. 史上最全canOpenURL: failed问题解决办法
  19. 关于H5的知识点(HTML+CSS+JS)
  20. mac上安装windows系统

热门文章

  1. Wopus问答第一期
  2. Nginx + ModSecurity 报错
  3. 树莓派开箱点亮(无屏幕)
  4. 查询我的订单功能的实现
  5. ArcGIS earth 1.0 beta体验报告——给我一个按钮我将转动整个地球
  6. 查看kafka的版本
  7. TensorFlow2.0 Guide官方教程 学习笔记17 -‘Using the SavedModel format‘
  8. 期刊论文添加基金项目、作者简介
  9. 计算机网络通信中的交换方式有哪几种,数据通信方式有哪几种
  10. 深信服校园招聘c/c++软件开发A卷