Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Float-Wert auslesen mithilfe von Readprocessmemory (https://www.delphipraxis.net/115192-float-wert-auslesen-mithilfe-von-readprocessmemory.html)

infY2k7 7. Jun 2008 17:57


Float-Wert auslesen mithilfe von Readprocessmemory
 
Hallo, folgendes Problem:
Ich muss einen Wert aus einem Speicher auslesen. Solange der Wert im Format 4 oder 8 Bytes vorliegt, mache ich das mit meiner Funktion f_memoryread:

Delphi-Quellcode:
function f_memoryread(WindowTitle:Pansichar;adresse,size:integer):integer;
var p : pointer;
    puffer : array[0..1] of DWord;
    BytesRead: DWord;
    WindowName,ProcessId,ThreadId,HandleWindow : integer;
   begin
        p := ptr(adresse);  //Adresse umwandeln:
        WindowName := FindWindow(nil,WindowTitle); //get Handle
        ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId);
        HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
        ReadProcessMemory( HandleWindow, p , @puffer[0], size, BytesRead );
        closehandle(HandleWindow);//close
        f_memoryread := Puffer[0];
   end;//of f_memoryread
In Cheat-Engine kann man den Typ eines Wertes einstellen, siehe Bild:

http://1337files.13.funpic.de/Unbenannt-1.jpg

Wenn ich hier 4Byte wähle, ist der Wert "1149107790". Wenn ich jedoch Float auswähle, ist der Wert "1015,97351074219"!

Den 4Byte Wert dieser Adresse (1149107790) auszulesen ist mit der o.g. Funktion kein Problem, jedoch brauch ich den Float-Wert! Für die variable size einfach "float" statt "4" oder "8" zu schreiben, funktioniert nicht!

Weiß jemand, wie ich diesen auslese? Oder gibts eine Funktion, mit der man 4Bytes in Float umwandeln kann? Dann könnte ich den Wert ganz normal auslesen und anschließend einfach umwandeln.

Bitte um Hilfe, mfg infY

marabu 7. Jun 2008 19:26

Re: Float-Wert auslesen mithilfe von Readprocessmemory
 
Hallo,

ich würde es mal mit dem reellen Typ "Single" probieren. Der belegt übrigens 4 Byte.

Grüße vom marabu

zarcaphii 7. Jun 2008 20:10

Re: Float-Wert auslesen mithilfe von Readprocessmemory
 
Zitat:

Zitat von infY2k7
Für die variable size einfach "float" statt "4" oder "8" zu schreiben, funktioniert nicht!

Auch nicht SizeOf(Float)?

infY2k7 8. Jun 2008 13:49

Re: Float-Wert auslesen mithilfe von Readprocessmemory
 
Zitat:

Zitat von marabu
Hallo,

ich würde es mal mit dem reellen Typ "Single" probieren. Der belegt übrigens 4 Byte.

Grüße vom marabu

Habs mal so Probiert:
Delphi-Quellcode:
ReadProcessMemory(HandleWindow,pointer(p),@ausgabe,single,BytesRead);
Jedoch dann kommt die Fehlermeldung:"E2029 '(' erwartet,aber ',' gefunden"!
Mit sizeof(single) gehts, aber da kommt auch nur dieser normale 4 Byte Wert raus(1149107790)!

Zitat:

Zitat von zarcaphii
Zitat:

Zitat von infY2k7
Für die variable size einfach "float" statt "4" oder "8" zu schreiben, funktioniert nicht!

Auch nicht SizeOf(Float)?

Ne, geht auch nicht:
Delphi-Quellcode:
ReadProcessMemory(HandleWindow,pointer(p),@ausgabe,sizeof(float),BytesRead);
Fehler:"E2003 Undefinierter Bezeichner 'float'!

Hat noch jemand eine Idee? :pale:

SirThornberry 8. Jun 2008 13:58

Re: Float-Wert auslesen mithilfe von Readprocessmemory
 
wenn du deinen 4 Byte Fließkommawert lesen willst solltest du dir in Delphi den entsprechenden Typen heraus suchen. Das er in Delphi nicht Float heißt sollte doch nicht das Problem sein.

infY2k7 8. Jun 2008 14:04

Re: Float-Wert auslesen mithilfe von Readprocessmemory
 
Zitat:

Zitat von SirThornberry
wenn du deinen 4 Byte Fließkommawert lesen willst solltest du dir in Delphi den entsprechenden Typen heraus suchen. Das er in Delphi nicht Float heißt sollte doch nicht das Problem sein.

Ja genau da ist mein Problem ich weiß nicht welchen Typ ich nehmen soll =.=

infY2k7 8. Jun 2008 14:09

Re: Float-Wert auslesen mithilfe von Readprocessmemory
 
Okay, mit single gehts doch! Für die, die dasselbe Problem haben hier mal meine Funktion:

Delphi-Quellcode:
function f_memoryreadfloat(WindowTitle:Pansichar;adresse:integer):single;
var p : pointer;
    puffer : single;
    BytesRead: DWord;
    WindowName,ProcessId,ThreadId,HandleWindow : integer;
   begin
        p := ptr(adresse);  //Adresse umwandeln:
        WindowName := FindWindow(nil,WindowTitle); //get Handle
        ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId);
        HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
        ReadProcessMemory( HandleWindow, p , @puffer,sizeof(single), BytesRead ); //READ
        closehandle(HandleWindow);//close
        f_memoryreadfloat := Puffer;
   end;//of f_memoryread
puffer : single hatte ich vorher vergessen!

danke für eure hilfe mfg infY!!

Troelli 23. Apr 2009 15:05

Re: Float-Wert auslesen mithilfe von Readprocessmemory
 
Sorry das ich den hier nochmal raushole ...
Aber hat das mal einer probiert?
Bei
HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
bekomme ich Grundsätzlich eine 0 also kein handle.
(Ich bin mir sicher das ich richtige ProcessID habe)

Ich würde mir gerne Infos aus einen Spiel saugen, lesenderweise.
Aber wie ichs auch versuche ... es bleibt bei 0 und ich bekomme nix aus dem Memory.
Das Beispiel passt vorzüglich zu mir wegen dem Float.
Hat da jemand eine Idee woran das liegen könnte?


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:14 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