Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi WriteProcessMemory funktioniert nicht (https://www.delphipraxis.net/131669-writeprocessmemory-funktioniert-nicht.html)

-=Breeze=- 28. Mär 2009 18:21


WriteProcessMemory funktioniert nicht
 
Guten Abend,

ich habe vor einigen Tagen eine Prozedur geschrieben, die mithilfe von WriteProcessMemory Werte in einem Spiel verändert.

Doch nach kleinen Veränderungen funktioniert diese leider nicht mehr, und ich finde den Fehler einfach nicht...
Die Adresse ist statisch, werden beim Neustart des Spiels nicht verändert.

Hier der Code, ich hoffe jemand findet den Fehler :D

Delphi-Quellcode:
const
  WindowTitle  = 'SPIEL-NAME';
  Address      = $00431CA8;
  NumberOfBytes = 1;


procedure TForm1.setlives(lives: integer);
begin
  if DX_running then        // wenn das Spiel läuft
  begin
  GetMem(buf,1);
  ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId);
  HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);

  try
    buf^ := Chr(Lives);
    WriteProcessMemory(HandleWindow,ptr(Address), buf, NumberOfBytes, write);
  finally
    FreeMem(buf);
    closehandle(HandleWindow);
  end;
  end;
end;

Luckie 28. Mär 2009 18:53

Re: WriteProcessMemory funktioniert nicht
 
Könntest du was mit der Fehlermeldung "Läuft nicht mehr" anfangen? ;)

Christian Seehase 29. Mär 2009 14:49

Re: WriteProcessMemory funktioniert nicht
 
Moin Breeze,

ich finde, Du solltest Deinen Code erst einmal etwas "aufräumen" ;-)

Du prüfst nämlich nicht, ob Deine Funktionsaufrufe überhaupt erfolgreich waren.
Wenn OpenProcess fehlschlägt, was gerade bei PROCESS_ALL_ACCESS leicht passieren kann, bekommst Du kein gültiges Handle, und WriteProcessMemory muss fehlschlagen.

-=Breeze=- 29. Mär 2009 22:20

Re: WriteProcessMemory funktioniert nicht
 
Guten abend,
"läuft nicht mehr" bedeutet hier, dass es keinerlei Fehler gibt, die Speicheradresse aber nicht verändert wird.

@christian: soll ich nach openprocess überprüfen, ob das Handle=0 ist?

himitsu 29. Mär 2009 22:45

Re: WriteProcessMemory funktioniert nicht
 
Rückgabewerte solltest du möglicht immer prüfen :warn:

Christian Seehase 30. Mär 2009 00:18

Re: WriteProcessMemory funktioniert nicht
 
Moin Breeze,

schau Dir doch einfach mal die Dokumentation zu MSDN-Library durchsuchenOpenProcess und MSDN-Library durchsuchenWriteProcessMemory an, dann weisst Du auf welche Werte Du testen musst.
Im Fehlerfalle kannst Du Dir dann mit

Delphi-Quellcode:
ShowMessage(SysErrorMessage(GetLastError));
den Fehler im Klartext anzeigen lassen.

-=Breeze=- 30. Mär 2009 22:58

Re: WriteProcessMemory funktioniert nicht
 
Nachdem ich WriteProcessMemory aufrufe, spuckt er als Error das aus:
"Das Handle ist ungültig"
Ich werde mal ein bisschen probieren...

Kann es außerdem sein, dass in der Variable ProcessId gar nichts gespeichert wird?

Delphi-Quellcode:
  ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId);
HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);

Nächstes Edit
:lol:

Ich war mal wieder zu voreilig, und habe die Lösung.

Einleuchtend ist jetzt, warum er kein richtiges Handle gefunden hat^^
Schließlich habe ich WindowName verwendet, aber nicht vorher bestimmt.

Der folgende Code hat also ausgereicht, um das Problem zu beheben :oops: :oops:

Delphi-Quellcode:
WindowName := FindWindow(nil, WindowTitle);
Nochmal vielen Dank für eure Tips :angel:


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