Einzelnen Beitrag anzeigen

jus

Registriert seit: 22. Jan 2005
344 Beiträge
 
Delphi 2007 Professional
 
#5

AW: CPU und GPU Temperatur auslesen

  Alt 15. Okt 2016, 02:59
Für mich wäre grundsätzlich beides ok
Bei den Internen Sensore habe ich gehört, dass die scheinbar schwer auszulesen sind. Dafür wären die natürlich um Welten komfortabler.
Den Thread habe ich gesehen, aber da kam ja glaub nicht wirklich zu einem Ergebnis.

Temperatursensoren haben das Problem, dass sie schwer zum Beispiel auf der CPU anzubringen sind, da da ja noch ein Kühler draufsitzt
Soll das Programm nur für eine spezielle CPU funktionieren oder für alle CPUs? Wenn es um neuere Intel CPUs geht, da habe ich mich vor einiger Zeit kurz damit beschäftigt. Bei moderneren Intel CPUs braucht man im Prinzip nur das MSR Register 19h (steht in diversen Intel Dokus drin) auslesen. Das Problem ist nur, dass das Auslesen von MSR Register für User Mode (Ring3) unter Windows gesperrt ist. Es ist nur in Ring0 möglich. Die Lösung ist, dass man dies über einen Treiber macht, da der Treiber in Ring0 ist. Einen Treiber mit der nur den Befehl RDMSR ausführt, könnte man zwar schnell mit der WDK machen, aber dann gibt es noch die Problematik, dass der Treiber am besten zertifiziert sein soll, damit Windows da nicht meckert usw. ..... Um die Sache abzukürzen, es gibt bereits fertige Treiber mit der Fähigkeit, das MSR Register auszulesen, die auch zertifiziert sind, wenn ich mich nicht irre von openlibsys.org. Um die Lizenzgeschichte mußt du dich halt selber kümmern, in meinem Fall war das nur für den Hausgebrauch. Sprich, man braucht nur, soweit ich mich erinnere, die WinRing0.dll und die WinRing0.sys in das Programmverzeichnis reinzukopieren und die WinRing0.dll in Delphi zu laden.

Im Prinzip schaut dann der Sourcecode dann in Delphi ungefähr so aus:
Delphi-Quellcode:
var
  Form1: TForm1;

function InitializeDll: LongBool; stdcall; external 'WinRing0.dllname 'InitializeOls';
procedure DeinitializeDll; stdcall; external 'WinRing0.dllname 'DeinitializeOls';
function Rdmsr(index:dWORD;var eax,edx:dWORD): LongBool; stdcall; external 'WinRing0.dllname 'Rdmsr';

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  eax,edx:dword;
begin
  RdMSR($19C, eax,edx) ;
  Memo1.Lines.Add('MSR $19C: ');
  Memo1.Lines.Add('eax: '+IntToHex(eax,8));
  Memo1.Lines.Add('edx: '+IntToHex(edx,8));
end;

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

procedure TForm1.FormCreate(Sender: TObject);
var
  ergebnis: LongBool;
begin
  ergebnis:=InitializeDll;
  if ergebnis then Memo1.Lines.Add('InitializeDll: OK')
  else Memo1.Lines.Add('InitializeDll: NOT OK');
end;
Ob der obige Source 100% funktioniert habe ich nicht ausgetestet, da ich die WinRing0 Sachen nicht mehr auf meine Platte finde. Es gibt aber hier im Forum einige Sourcen zum Thema. Mußt halt mal die Suche anwerfen.

Lg,
jus

Nachtrag: Habe die WinRing0 Sachen doch noch gefunden und unter Delphi 2007 ausprobiert, sprich 32bit Anwendung. Ich mußte die Project1.exe extra unter Windows 7 als Administrator starten, damit der Treiber geladen wurde. Falls du ein 64bit Programm machst, brauchst du aber die WinRing0x64.dll und WinRing0x64.sys.

Geändert von jus (15. Okt 2016 um 03:19 Uhr)
  Mit Zitat antworten Zitat