Autor Beitrag
KarYn-To
Hält's aus hier
Beiträge: 2



BeitragVerfasst: So 26.08.07 17:34 
Hallo Leute,

ich hab ein riesiges Problem. Ich hab ein Programm geschrieben, dass den Speicher eines anderen Programms ausliest. Sobald STRG+ALT+ENTF gedrückt wird, kann mein Programm nicht mehr im Speicher zugreifen und gibt mit GetLastError = ERROR_ACCESS_DENIED aus. Ergo, ich kann in diesem Bildschirm (Computer sperren... etc... Task-Manager starten) nicht mehr auf den Speicher des Prozesses zugreifen.

Jetzt ist mein Problem ich checke durch ReadProcessMemory, ob der Prozess noch aktiv ist. Und wenn ERROR_ACCESS_DENIED drei mal hintereinander beim Zugriff auf den Speicher auftritt, dann werden die Prozesse aus der Überwachungsliste gelöscht.

Gibt es einen anderen Weg, wie man überprüfen kann, ob ein Prozess noch nicht beendet ist ?
Gibt es eine Möglichkeit trotz STRG-ALT-ENTF auf den Prozess über ReadProcessMemory zuzugreifen ?
Wieso kann man eigentlich nicht mehr darauf zugreifen ?

^^ ein paar kleine Fragen, mFG Angelo

P.S. das Programm was überwacht wird ist ein Konsolenprogramm.
KarYn-To Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: So 26.08.07 19:46 
Danke für die schnelle Hilfe Jungs, alleine hätte ich es nie geschafft.

Also zunächst mal hab ich ein falsches Vorgehen gehabt, weil ich mit ReadProcessMemory geprüft habe, ob ich noch auf den Prozess zugreifen kann. Das war definitiv falsch, okay, das ganze hab ich natürlich geändert. Nach bisschen stöbern in dem Windows SDK sah ich die Funktion GetExitCodeProcess und hab das ganze damit umgeschrieben. Jetzt überprüfe ich, ob ich auf den Prozess zugreifen kann mit ReadProcessMemory und wenn nicht sicherheitshalber nochmal, ob dieser geschlossen wurde. Also falls GetExitCodeProcess mit STILL_ACTIVE ausspuckt, überprüft er den Prozess weiter.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function IsProcActive(hProc: Cardinal): Boolean; 
var exCode: Integer; 
begin 
  Result := False; 
  GetExitCodeProcess(hProc, exCode); 
  if exCode <> 259 then 
    Result := True; 
end;


Das wäre die Funktion und ich hoffe auf gute Zusammenarbeit und zukünftige Hilfe.
MfG Angelo