win系统cpu温度获取
基于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温度获取相关推荐
- 黑苹果 CPU温度获取 (这个有问题 谨慎安装)
黑苹果CPU温度获取 1,安装HWSensors 2,重启系统 1,安装HWSensors HWSensors.6.26.1440.Binaries.dmg.zip下载 Clover Configur ...
- 苹果笔记本电脑运行win系统时温度过高解决办法
如果大家用的是MacBook Pro系列的笔记本电脑,特别是在Win系统下,一定都会遇到温度过高的问题吧,特别是在运行网络游戏.AE.AutoCAD等大软件时,这个问题尤为突出.但如果在很多搜索网站搜 ...
- linux系统cpu温度监控,用软件lm_sensors监测Linux系统和CPU温度
用软件lm_sensors监测Linux系统和CPU温度来源:互联网 作者:佚名 时间:09-08 17:03:29 [大 中 小] 点评:lm_sensors的软件可以帮助我们来监控主板,CPU的工 ...
- linux系统cpu温度监控,怎么看cpu温度-ZABBIX监控Linux主机CPU温度
Linux主机安装Im_sensors [root@localhost ~]# yum install -y lm-sensors [root@localhost ~]# sensors-detect ...
- linux 查看cpu_看看你的嵌入式设备CPU温度是多少,能烤肉吗?
点击上方「嵌入式大杂烩」,「星标公众号」第一时间查看嵌入式笔记! 大家应该都看过一些大佬发的电脑CPU烤肉的视频,电脑CPU的温度真的有那么高吗?我们一起来看一下咱们电脑CPU的温度是多少? PC端C ...
- 嵌入式Linux跑分软件,看看你的嵌入式设备CPU温度是多少,能烤肉吗?
点击上方「嵌入式大杂烩」,「星标公众号」第一时间查看嵌入式笔记! 大家应该都看过一些大佬发的电脑CPU烤肉的视频,电脑CPU的温度真的有那么高吗?我们一起来看一下咱们电脑CPU的温度是多少? PC端C ...
- Linux系统获取CPU温度
Linux系统获取CPU温度 摘自:https://jingyan.baidu.com/article/cbf0e500407d072eab289343.html 各位好,本篇将简单介绍如何在不同系列 ...
- BMC通过PECI接口获取CPU温度实现方法
本文转载于网络,侵权删. PECI是用于监测CPU及芯片组温度的一线总线(one-wirebus),全称是Platform Environment Control Interface.它最主要的应用是 ...
- python获取cpu温度_如何获得树莓派CPU实时温度值
[前言] 任何的电子设备在工作过程中必定会产生发热的现象,而不控制好设备的温度的话,很有可能会损坏设备,或者照成设备的性能下降,本文将通过学习如何读取树莓派CPU温度值,方便后期对树莓派做一些相应的控 ...
最新文章
- Java各类型变量之间的转换
- 判断手势_手势密码有几种?
- 404 为什么是 404?
- Silverlight的诸多效果(小鸟飞,白云走,气球飘,图片展示)附源码
- 【SQLServer】将Job运行结果发送电子邮件通知用户
- unity3 学习localPosition, Position区别,itween插件,计算距离
- WebView load**方法 加载资源【总结】
- alienfx无法与计算机,戴尔G3无法检测到AlienFX设备怎么办
- Editormd的使用——在线编辑和查看文章
- 用C语言打印九九乘法表
- shell输出毫秒_Shell获取毫秒时间
- 硬件设计4---什么是电感磁珠?
- 数据集分享 | IWR1642呼吸心跳数据集
- 浙大计算机城市学院联合培养,浙大城市学院 今日视点 城市学院2007届联合培养硕士研究生顺利毕业...
- 超市管理系统用例建模
- android电视如何打开adb调试模式,分享解密某Android电视adb后门方法
- java 手动垃圾回收_java如何进行垃圾回收的
- 史上最全canOpenURL: failed问题解决办法
- 关于H5的知识点(HTML+CSS+JS)
- mac上安装windows系统
热门文章
- Wopus问答第一期
- Nginx + ModSecurity 报错
- 树莓派开箱点亮(无屏幕)
- 查询我的订单功能的实现
- ArcGIS earth 1.0 beta体验报告——给我一个按钮我将转动整个地球
- 查看kafka的版本
- TensorFlow2.0 Guide官方教程 学习笔记17 -‘Using the SavedModel format‘
- 期刊论文添加基金项目、作者简介
- 计算机网络通信中的交换方式有哪几种,数据通信方式有哪几种
- 深信服校园招聘c/c++软件开发A卷