首页
社区
课程
招聘
[旧帖] 请教如何获取传感器信息,例如CPU温度。 0.00雪花
发表于: 2011-6-6 18:34 15090

[旧帖] 请教如何获取传感器信息,例如CPU温度。 0.00雪花

2011-6-6 18:34
15090
如题,如何用.net或delphi实现呢?
EVEREST Ultimate Edition、驱动精灵等软件是如何做到的?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 143
活跃值: (61)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
2
不知,**!
2011-6-6 19:12
0
雪    币: 287
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
第一个途径是通用接口,与具体硬件配置无关的。Everest极有可能使用这类接口。
第二个途径是硬件厂商保留的底层接口,这些可能并不公开,只用在与硬件配套发行的utilities上。

LZ感兴趣的应该是第一类接口。微软提供了一整套与系统硬件相关的类。通过这些类可以监控冷却系统、主板传感器、电源等硬件。我自己没有写过读取这类信息的程序,只能提供一些线索。LZ可以试着自己写一下。

温度传感器的类是Win32_TemperatureProbe,参考文档见MSDN - Computer System Hardware Classes这一节。地址:http://msdn.microsoft.com/en-us/library/aa389273(v=VS.85).aspx

class Win32_TemperatureProbe : CIM_TemperatureSensor
{
  ……
  sint32   CurrentReading;  //注意这个成员是保留的,现在并不能使用。我不太清楚如果它不能用,还能从哪里读取当前的温度信息。

  ……  
};

如果上述参考信息还不足以解决所有问题,LZ可以试试搜索SMBIOS(System Management BIOS)方面的信息,那些传感器的数据都是通过SMBIOS返回的。
2011-6-7 14:47
0
雪    币: 377
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
向3楼认真学习一下ai
2011-6-10 15:05
0
雪    币: 346
活跃值: (129)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
呵~
  我原来也郁闷 别人是怎么获取这些信息的
谢谢三楼
2011-6-12 20:24
0
雪    币: 241
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
.net有个类结构managementObject
可以通过WMI读取一部分的硬件信息
http://msdn.microsoft.com/zh-cn/library/system.management.managementobjectsearcher(v=vs.80).aspx
2011-6-13 15:17
0
雪    币: 28
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
估计要写驱动或者从芯片厂商那里获得接口
2011-6-13 21:28
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
比较高级的接口,一般都是WMI,如三楼说所的那样。楼主可以MSDN WMI中相关的类。
2011-6-13 21:55
0
雪    币: 4560
活跃值: (1002)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
前段时间刚做过这个,俺也是看别人的帖子写的,利用的是一个WinRing0.sys驱动通过Intel的指令取得的温度

新的酷瑞CPU和AMD的CPU 内部都集成有温度传感器DTS (Digital Thermal Sensor),每个核心有一个,以前的移动CPU好像也支持温度探测,但手头没有这样的CPU没法做测试.AMD 的温度值保存在 NB 寄存器中,酷瑞CPU 的 DTS 值保存在 MSR 0x19c 中,可以通过 rdmsr 来读取
       这里只说酷睿CPU的读取过程
       Intel 定义 eax=6 执行 cpuid,  然后测试 eax 第一位是否为1,如果为1表示CPU支持DTS ,当然之前应该以 eax=0 执行 cpuid 检测 eax 支持的最大命令数,如果小于6就肯定不支持DTS。
       读取DTS:1 以 ecx=0xee 执行 rdmsr 指令, 测试 eax 的第30位是否为 1, 如果为 1 表示温度计算的初始值为 85 度否则表示从100度开始计算,这个值称为 Tjunction. 然后以 ecx=0x19c 执行 rdmsr 指令,  eax 的 16:23 位为表示当前DTS 值,这个值并不代表当前温度,而要以下面公式计算.
       当前cpu温度 = Tjunction - DTS
       注意  signature 为 0x6f1, 0x6f0的 CPU DTS 值直接代表当前温度而不用Tjunction 相减. 而 signature 小于等于 0x6f4 的 Tjunction 一直为100, 如果你是双核的cpu 可以使用 SetProcessAffinityMask API 来指定执行的CPU,以检测这个核心的温度。呵呵,我就不用啦,本本是单核的
       另 rdmsr 指令需要运行在 0 级的代码才能执行.所以写一个简单的驱动也是必须的.
2011-6-14 13:45
0
雪    币: 287
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
请问LS的方法在Win7平台上能否使用?Ring0的应该属于KMDF了吧?
2011-6-15 00:21
0
游客
登录 | 注册 方可回帖
返回
//