Консультация № 178343
12.05.2010, 12:43
45.00 руб.
0 1 1
Здравствуйте уважаемые эксперты!
Очень необходима Ваша помощь. Помогите, пожалуйста написать программу для проекта, с помощью WinApi, часть уже выполнена и осталось совсем немного, но время поджимает а навыков в API мало... =(

Ну и собственно вопрос такой:
Необходимо разработать программу используя WinApi с получением данных о температуре следующих устройств: процессора, жесткого диска, видео карты, материнской платы и скорости вращения вентиляторов. Все данные должны сохраниться в отдельном файле допустим txt.
Среда программирования: любая.

Если Вас не затруднит, выложите исходник, буду очень благодарен!

Обсуждение

давно
Профессор
230118
3054
17.05.2010, 13:20
общий
это ответ
Здравствуйте, Лукин Андрей.

Данный пример сразу отмечу - работает только с процессорами Intel и использует драйвер Giveio.sys (его не выкладываю - можно с легкостью найти в Интернете - главное, поместить его в папку system32 - поэтому нужно программно позаботиться чтобы он туда попал - скопировать ). Есть еще одна проблема - но это уже на аппатарном уровне - не всегда находит датчик температур - но это не беда - в этих случаях и Everest не может определить температуру.

Приложение:
...
uses
Windows, Messages, SysUtils, Classes, Forms, Graphics,
Dialogs, Registry, StdCtrls, StrUtils, ComCtrls, Controls, ExtCtrls,
ShellAPI, Menus, winsvc;

...

var
Form1: TForm1;
AverageTemp:Array[0..4] of Integer;
hSCMan,
hService,
hDevice : SC_HANDLE;
lpServiceArgVectors : PChar;
temp : LongBool;
serviceStatus : TServiceStatus;
DeviceName : String;

implementation

{$R *.dfm}
const
IntelBasePort:Integer = $290;

Procedure DoneDriver;
Begin
CloseHandle(hDevice);
hService := OpenService(hSCMan,PChar(DeviceName), SERVICE_ALL_ACCESS);
if hService <> 0 then
Temp := ControlService(hService,SERVICE_CONTROL_STOP,ServiceStatus);
if (hService <> 0) then
CloseServiceHandle(hService);
hService := OpenService(hSCMan,PChar(DeviceName), SERVICE_ALL_ACCESS);
temp := DeleteService(hService);
CloseServiceHandle(hService);
end;

function InPort(port:word):byte;assembler;stdcall;
asm
mov dx,port
in al,dx
mov Result,al
end;

Procedure OutPort(port:word; value:byte);assembler;stdcall;
asm
mov al, value
mov dx, port
out dx, ax
end;

Function Temperature:Integer;
begin
OutPort(IntelBasePort+5,$27);
Result:=(InPort(IntelBasePort+6));
end;


function ReadTemp:Word;
var
tmp1: byte;
tmp2: byte;
Temp: word; // 16-bit unsigned integer
Temp1: integer;
i:integer;
begin
asm
mov cx,128 //decimal, poll busy flag max. 128 times
mov dx,$0295
@WaitReady1:
in al,dx
and al,128 //decimal
jz @ExitWait
dec cx
jnz @WaitReady1
@ExitWait:
mov dx,$0295
mov al,78 // 78 dec. is the bank select register
out dx,al
inc dx
mov al,1 // select bank 1
out dx,al
mov dx,0295h
mov al,80 // 80 dec. is the temperature High register
out dx,al
inc dx
in al,dx // fetch temp Hi from 81 dec.
shl al,1
mov tmp1,al
mov dx,0295h
mov al,81 // 81 dec. is the temperature Low register
out dx,al
inc dx
in al,dx // fetch temp Lo from 82 dec.
shr al,7
mov tmp2,al
// calculate reading
xor ah,ah
xor cx,cx
mov al,tmp1
mov cl,tmp2
add ax,cx
shr ax,1
mov Temp,ax
end;
Temp1:=0;
if (Temp>0) and (Temp<100) then
begin
for i:=0 to 3 do AverageTemp[i]:=AverageTemp[i+1];
AverageTemp[4]:=Temp;
if AverageTemp[0]=0 then for i:=0 to 3 do AverageTemp[i]:=AverageTemp[4];
for i:=0 to 4 do Temp1:=Temp1+AverageTemp[i];
Temp1:=round(Temp1 / 5);
end;
if Temp1<0 then Temp1:=0;
if Temp1>65536 then Temp1:=0;
Result:=Temp1; // Result is not a variable but holds the function return value
end;

function openIO:boolean;
begin
lpServiceArgVectors:=nil;
DeviceName:='giveio';
hSCMan:=OpenSCManager(Nil,Nil,SC_MANAGER_CREATE_SERVICE);
IF hSCMan <> 0 Then
hService:=CreateService(
hSCMan,
pChar(DeviceName),
pChar(DeviceName),
SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,
PChar('c:\windows\system32\giveio.sys'),nil,nil,nil,nil,nil);
If hService<>0 then
CloseServiceHandle(hService);
hService:=OpenService(hSCMan,pChar(DeviceName),SERVICE_ALL_ACCESS);
If hService<>0 then
begin
StartService(hService,0,PChar(lpServiceArgVectors));
CloseServiceHandle(hService);
end;
hDevice:=CreateFile(pChar('\\.\'+DeviceName),
GENERIC_READ or GENERIC_WRITE,0,PSECURITY_DESCRIPTOR(nil),
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
openIO;
sleep(5000);
Timer1.Enabled:=True;
end;


procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled :=False;
Label1.Caption :=IntToStr(ReadTemp); {проц}
Label2.Caption :=IntToStr(Temperature); {мать}
Timer1.Enabled :=True;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
DoneDriver;
end;

end.
5
Форма ответа