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
 
Razor
(Gast)

n/a Beiträge
 
#1

C++ 2 Delphi, Core2duo/quad Reading

  Alt 27. Aug 2007, 13: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
 


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 23:11 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