您的位置:首页 > 编程语言 > C语言/C++

温度读取vc++获取cpu温度

2013-06-01 20:44 232 查看
本篇文章个人在北京喝咖啡的时候突然想到的...今天就有想写几篇关于温度读取的文章,所以回家到之后就奋笔疾书的写出来发表了

要获得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

文章结束给大家分享下程序员的一些笑话语录: 爱情观

  爱情就是死循环,一旦执行就陷进去了。

  爱上一个人,就是内存泄露--你永远释放不了。

  真正爱上一个人的时候,那就是常量限定,永远不会改变。

  女朋友就是私有变量,只有我这个类才能调用。

  情人就是指针用的时候一定要注意,要不然就带来巨大的灾难。

---------------------------------
原创文章 By
温度和读取
---------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: