AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) C++ C++ 2 Delphi, Core2duo/quad Reading
Thema durchsuchen
Ansicht
Themen-Optionen

C++ 2 Delphi, Core2duo/quad Reading

Ein Thema von Razor · begonnen am 27. Aug 2007 · letzter Beitrag vom 7. Mai 2008
Antwort Antwort
Seite 1 von 2  1 2      
Razor
(Gast)

n/a Beiträge
 
#1

C++ 2 Delphi, Core2duo/quad Reading

  Alt 27. Aug 2007, 14:40
Can somebody translate this delphi,i want to use this for core2duo/core2quad/core2solo temperature reading,i have the driver and i will post it it when i am done,so if anybody knows how to translate this to delphi...


Code:
#include <float.h>
#include <stdio.h>
#include <windows.h>

#include "C2DTemp.h"
#include "RivaTunerExports.h"
#include "MonitoringSourceDesc.h"

HINSTANCE g_hModule = NULL;
HMODULE g_hHost = NULL;

READ_MSR_PROC g_pReadMSR = NULL;

DWORD g_dwCPU = 0;
BOOL g_bHasDTS = FALSE;
FLOAT g_fTjmax = 100.0f;

const char * const szDim = "°C";
const char * const szDesc = "CPU temperature as reported by on-die Digital Thermal Sensor";
const char * const szGroup = "CPU";

BOOL DetectCPUFeatures(void)

const char ven_intel[12] = {'G','e','n','u','i','n','e','I','n','t','e','l'};
char vendor[12];
DWORD last_fn = 0, fn6_eax = 0;

memset(vendor, 0, 12);

// try to execute CPUID instruction
__try { 
__asm { 
xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx
cpuid
mov dword ptr [last_fn], eax
mov dword ptr [vendor], ebx
mov dword ptr [vendor + 4], edx
mov dword ptr [vendor + 8], ecx


__except (GetExceptionCode() == STATUS_ILLEGAL_INSTRUCTION) { 
return FALSE;


// Is it GenuineIntel CPU? 
if (strncmp(vendor, ven_intel, 12) != 0) { 
return FALSE;


// Does it support Digital Thermal Sensor and Power Management CPUID leaf? 
if (last_fn < 6) { 
return FALSE;


__asm { 
mov eax, 6 
cpuid
mov dword ptr [fn6_eax], eax


// Is Digital Thermal Sensor feature supported? 
if ((fn6_eax & 0x1) == 0) { 
return FALSE;


return TRUE;


BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)

UNREFERENCED_PARAMETER(lpReserved);

if (dwReason == DLL_PROCESS_ATTACH) { 
g_hModule = hInstance;
g_bHasDTS = DetectCPUFeatures();


return TRUE;


C2DTEMP_API DWORD GetSourcesNum(void)

SYSTEM_INFO si;

GetSystemInfo(&si);

g_dwCPU = si.dwNumberOfProcessors;

return g_dwCPU;


C2DTEMP_API BOOL GetSourceDesc(DWORD dwIndex, LPMONITORING_SOURCE_DESC pDesc)

DWORD hi, lo;

if (g_pReadMSR == NULL) { 
g_hHost = GetModuleHandle(NULL);

if (g_hHost == NULL) { 
return FALSE;


g_pReadMSR = (READ_MSR_PROC)GetProcAddress(g_hHost, "ReadMSR");

if (g_pReadMSR == NULL) { 
return FALSE;


if (!g_bHasDTS) { 
return FALSE;
} else { 
// Try to detect Tjunction
if (!g_pReadMSR(0xEE, &hi, &lo)) { 
return FALSE;

if (lo & 0x40000000) { 
g_fTjmax = 85.0f;




sprintf(pDesc->szName, "CPU%ld temperature", dwIndex);
strcpy(pDesc->szDim , szDim);
strcpy(pDesc->szDesc , szDesc);

if (pDesc->dwVersion >= 0x00010002) { 
strcpy(pDesc->szGroup, szGroup);


pDesc->fltMaxLimit = 100.0f;
pDesc->fltMinLimit = 0.0f;
pDesc->fltGridDim = 10.0f;

return TRUE;


C2DTEMP_API FLOAT GetSourceData(DWORD dwIndex)

static FLOAT val[32] = { FLT_MAX, FLT_MAX, FLT_MAX, FLT_MAX,
FLT_MAX, FLT_MAX, FLT_MAX, FLT_MAX,
FLT_MAX, FLT_MAX, FLT_MAX, FLT_MAX,
FLT_MAX, FLT_MAX, FLT_MAX, FLT_MAX,
FLT_MAX, FLT_MAX, FLT_MAX, FLT_MAX,
FLT_MAX, FLT_MAX, FLT_MAX, FLT_MAX,
FLT_MAX, FLT_MAX, FLT_MAX, FLT_MAX,
FLT_MAX, FLT_MAX, FLT_MAX, FLT_MAX
};

DWORD_PTR dwMask, dwProcessAffinityMask, dwSystemAffinityMask;
DWORD hi, lo;

// Is DTS supported by this CPU? 
if (!g_bHasDTS) { 
return FLT_MAX;


// NOTE: This should be done by RivaTuner before calling plugins
// Will be removed when Alexey implements it internally

// Get current process and system affinity mask
if (!GetProcessAffinityMask(GetCurrentProcess(), &dwProcessAffinityMask, &dwSystemAffinityMask)) { 
return FLT_MAX;


// Temporarily enable execution on all the CPUs in the system
if (!SetProcessAffinityMask(GetCurrentProcess(), dwSystemAffinityMask)) { 
return FLT_MAX;


dwMask = 1 << dwIndex;

// Move the thread to the proper core
if (!SetThreadAffinityMask(GetCurrentThread(), dwMask)) { 
return FLT_MAX;


// Read IA32_THERM_STATUS MSR
if (!g_pReadMSR(0x19C, &hi, &lo)) { 
return FLT_MAX;


// Is reading valid? 
// If not, just return previous value
if ((lo & 0x80000000) == 0) { 
return val[dwIndex];


val[dwIndex] = g_fTjmax - (FLOAT)((lo >> 16) & 0x7F);

return val[dwIndex];
}
[edit=SirThornberry]quote-tag replaced with c-tag - Mfg, SirThornberry[/edit]
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#2

Re: C++ 2 Delphi, Core2duo/quad Reading

  Alt 27. Aug 2007, 15:00
You forget a lot of the Headerfiles like:

Code:
#include "C2DTemp.h"
#include "RivaTunerExports.h"
#include "MonitoringSourceDesc.h"
  Mit Zitat antworten Zitat
Razor
(Gast)

n/a Beiträge
 
#3

Re: C++ 2 Delphi, Core2duo/quad Reading

  Alt 27. Aug 2007, 15:24
Everything uploaded as you asked!
Angehängte Dateien
Dateityp: rar c2dtemp_141.rar (6,5 KB, 39x aufgerufen)
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: C++ 2 Delphi, Core2duo/quad Reading

  Alt 27. Aug 2007, 15:40
What about the old thread with the same question and code? here?
  Mit Zitat antworten Zitat
Razor
(Gast)

n/a Beiträge
 
#5

Re: C++ 2 Delphi, Core2duo/quad Reading

  Alt 27. Aug 2007, 15:42
Let moderators delete it,i stick to

New question>new thread
  Mit Zitat antworten Zitat
Razor
(Gast)

n/a Beiträge
 
#6

Re: C++ 2 Delphi, Core2duo/quad Reading

  Alt 27. Aug 2007, 21:13
Zitat:
@Razor:

I would say its very complex to translate C code into Delphi, and another problem is the driver you have. Every driver contains other methods with different calling parameters, so nobody knows how to access your specific driver.

The simplest way is to read the Intel® 64 and IA-32 Architectures Software Developer's Manual, where chapter 13 (Power And Thermal Management) contains the needed ways to gain the core temperatures. Before that you have to check the processor requirements, and if they are available (via the CPUID command, some bits in the Feature capabilities). The CPUID command is accessable in combination with Delphi itself, for the MSR access you need a device driver with ring 0 access and a delphi application with admin rights to load it.

If you have the routines to read MSR and CPUID functions, the temperature readout is quite simple. Just read the chapter 13 within the above Intel document. If there are other questions just ask. But be sure that nobody translates C code or wrote the Delphi code for you.

Hope that helps...

This is the driver i use.Will this do or it wont?

Another interesting code


Delphi-Quellcode:
function cDrvIface.ReadMSR(ulECX:DWord; var MSRreg:tmsr):boolean;
begin
  result:=false;
  FillChar(MSRreg, SizeOf(MSRreg), 0);
  if not isLoad then exit;
  if Assigned(fOSMethods[WindowsVer].RMSR) then
       result:=fOSMethods[WindowsVer].RMSR(ulECX, MSRreg);
end;
[edit=SirThornberry]delphi-tags replaced with quote-tags and quote-tags replaced with delphi-tags - Mfg, SirThornberry[/edit]
Angehängte Dateien
Dateityp: rar driver_567.rar (8,3 KB, 37x aufgerufen)
  Mit Zitat antworten Zitat
christian_u

Registriert seit: 13. Nov 2006
126 Beiträge
 
#7

Re: C++ 2 Delphi, Core2duo/quad Reading

  Alt 27. Aug 2007, 21:43
How many Threads with this Question you will Open in the Future ?
What is your offer for the Translation ?
  Mit Zitat antworten Zitat
Razor
(Gast)

n/a Beiträge
 
#8

Re: C++ 2 Delphi, Core2duo/quad Reading

  Alt 27. Aug 2007, 21:48
Dont u think other people will consider use of it also,so say what do we offer
  Mit Zitat antworten Zitat
christian_u

Registriert seit: 13. Nov 2006
126 Beiträge
 
#9

Re: C++ 2 Delphi, Core2duo/quad Reading

  Alt 28. Aug 2007, 07:39
Your right, as i see a lot of people want to translate the code.
  Mit Zitat antworten Zitat
DevidEspenschied

Registriert seit: 7. Sep 2006
Ort: Berlin
439 Beiträge
 
Delphi 12 Athens
 
#10

Re: C++ 2 Delphi, Core2duo/quad Reading

  Alt 28. Aug 2007, 11:33
The driver does not work, because it provides only functions to read/write to ports or the AMD chipset registers, but no MSR access. The separate function to read the MSR is for itself alone not runable, to see if it works I would need to see the complete code that function uses.

To be honest: I have written that complete temperature readout including the driver for x32/x64, but because there is a lot of work in it I'm NOT willing to share that for free. Other companies pay a lot of money to do that. And I believe nobody will translate C code into Delphi for free either (at least not in that amount)...
Devid
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz