AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Problem mit ReadProcessMemory unter Vista
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit ReadProcessMemory unter Vista

Ein Thema von KarYn-To · begonnen am 26. Aug 2007 · letzter Beitrag vom 27. Aug 2007
Antwort Antwort
KarYn-To

Registriert seit: 28. Apr 2007
18 Beiträge
 
#1

Problem mit ReadProcessMemory unter Vista

  Alt 26. Aug 2007, 14:32
Huhu Leute,

ich hab folgendes Problem. Mein Programm liest über ReadProcessMemory Daten aus einem anderen Programm aus. Soweit klappt das Auslesen wunderbar und das Programm kann Tagelang laufen, die Routinen sind sehr gut abgehandelt und geschrieben. Jedoch ist da ein kleines Manko, was sich nicht beheben lässt.

Und zwar, wird unter Vista STRG+ALT+ENTF gedrückt erscheint dieser Bildschirm mit Computer sperren, Benutzer wechseln... etc. Task-Manager starten.

Genau zu diesem Zeitpunkt kann mein Programm nicht mehr im Speicher des anderen Programms lesen. Das Problem ist auch folgendes, ich überprüfe über ReadProcessMemory und GetLastError, ob der Process noch aktiv ist. Vielleicht der etwas unschönere Weg, gibt bestimm elegantere Lösungen.

Delphi-Quellcode:
    
ReadProcessMemory(StrToInt(ProcList.Strings[X]), Ptr($507F60), @fName, 100, bRead);
if (GetLastError = ERROR_ACCESS_DENIED) then
begin
...
Danach werden die Prozesse auf denen kein Zugriff mehr geschehen kann entfernt. Funktioniert alles über einen Timer.

Ich hoffe ihr könnt mir da weiterhelfen.
MfG Angelo =)
"Wenn du nicht bereit bist, für eine Sache zu sterben, dann solltest du Freiheit aus deinem Vokabular streichen" - Malcolm X
  Mit Zitat antworten Zitat
KarYn-To

Registriert seit: 28. Apr 2007
18 Beiträge
 
#2

Re: Problem mit ReadProcessMemory unter Vista

  Alt 26. Aug 2007, 18:41
Wahnsinn und Verstand, beides auf einer Schwelle ^^. Ich hab bisschen in dem Windows SDK rumgeschnuppert und bin endlich zu ner Einsicht gekommen.

Ich benutze nicht mehr ReadProcessMemory in Verbindung mit ERROR_ACCESS_DENIED um zu überprüfen, ob das Programm noch läuft sondern GetExitCodeProcess in Verbindung mit STILL_ACTIVE (259);

Also, wenn ReadProcessMemory mir ERROR_ACCESS_DENIED ausspuckt, überprüfe ich mit GetExitCodeProcess, ob er mir STILL_ACTIVE ausspuckt, ansonten wurde der Prozess terminiert und ich kann ihn aus meiner Überwachungsliste austragen.

Delphi-Quellcode:
function IsProcActive(hProc: Cardinal): Boolean;
var exCode: Integer;
begin
  Result := False;
  GetExitCodeProcess(hProc, exCode);
  if exCode <> 259 then
    Result := True;
end;
Trotzdem danke für die schnelle Hilfe Jungs ^^
MfG Angelo
"Wenn du nicht bereit bist, für eine Sache zu sterben, dann solltest du Freiheit aus deinem Vokabular streichen" - Malcolm X
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#3

Re: Problem mit ReadProcessMemory unter Vista

  Alt 26. Aug 2007, 18:55
Bei ReadProcessMemory brauchst du doch ohnehin ein Handle. Warum nicht einfach mit WaitForSingleObject darauf warten, daß der Prozeß beendet wird?!

Nachtrag: Dein Code hat einen bösen Nachteil ... niemals Konstanten als literale Werte benutzen. Immer stattdessen das Symbol der Konstante benutzen. Klingt unwahrscheinlich, aber der Wert könnte auch zwischen verschiedenen Betriebssystemversionen variieren und dann hättest du ein Problem. Also lieber den Symbolnamen verwenden
  Mit Zitat antworten Zitat
KarYn-To

Registriert seit: 28. Apr 2007
18 Beiträge
 
#4

Re: Problem mit ReadProcessMemory unter Vista

  Alt 26. Aug 2007, 19:02
Wenn du mir das genauer erklären kannst, dann werd ich das umsetzen. Ich mein du hast Recht, wenn sich das von Win95 zu Vista geändert hat, dann hab ich wirklich ein Problem. Bin Einsteiger ^^...

Okay, mein Problem ist, dass die Prozesse nur beendet werden, wenn das Programm einen Fehler verursacht, oder komplett durch ist. Im besten Fall sollte das ganze bis ins unendliche Laufen, und ich muss einige Werte mit ReadProcessMemory aus der Datei auslesen. Das was ich programmiere ist sowas wie eine GUI. Ich habs schon über Pipes programmiert, aber ich brauche die Werte während das Programm gerade arbeitet und nicht am Ende, wenns fertig ist.

Ergo... WaitForSingleObject würde warten, bis das Programm zuende ist, und da es optimaler Weiße niemals aufhört zu laufen würde mein Programm ewig warten.

Kannst du aber nicht wissen, hätte ich besser erklären sollen =).

Wie meinst du das mit den literalen Werten ? Statt 259 einfach STILL_ACTIVE verwenden ?

Gruß Angelo
"Wenn du nicht bereit bist, für eine Sache zu sterben, dann solltest du Freiheit aus deinem Vokabular streichen" - Malcolm X
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#5

Re: Problem mit ReadProcessMemory unter Vista

  Alt 26. Aug 2007, 19:47
Zitat von KarYn-To:
Ergo... WaitForSingleObject würde warten, bis das Programm zuende ist, und da es optimaler Weiße niemals aufhört zu laufen würde mein Programm ewig warten.
Angenommen der Prozeß, welcher überwacht wird, crasht mal, soll er dann neugestartet werden?

Habe leider kein Delphi installiert, aber das hier sollte in etwa funzen:
Delphi-Quellcode:
while(WAIT_TIMEOUT = WaitForSingleObject(hProc, 1000))do
begin
  // Prozess neu starten und Handle an hProc zuweisen!
end;
Dieser Code checkt jede Sekunde, ob der Prozeß (Handle ist in hProc) noch läuft. Wenn nicht, wird er neugestartet.

http://msdn2.microsoft.com/en-us/library/ms687032.aspx

Zitat von KarYn-To:
Wie meinst du das mit den literalen Werten ? Statt 259 einfach STILL_ACTIVE verwenden ?
Exakt.
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#6

Re: Problem mit ReadProcessMemory unter Vista

  Alt 26. Aug 2007, 22:39
Läuft dein Programm im Programmmodus oder Dienstmodus?
Als Dienst solltest du immer Zugriff haben und überwachen. Zur Überwachung ist ein Dienst auch am besten geeignet.

Mit WTSRegisterSessionNotification und der Nachricht WM_WTSSESSION_CHANGE kannst du feststellen, ob eine Session gelockt wurde (und mehr).
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
KarYn-To

Registriert seit: 28. Apr 2007
18 Beiträge
 
#7

Re: Problem mit ReadProcessMemory unter Vista

  Alt 26. Aug 2007, 23:54
Mit WaitForSingleObject kann ich aber nur einen Prozess gleichzeitig überwachen oder ? Oder ich mach das ganze über Threads, jede Prozessüberwachung ein Thread. Dann wäre das möglich, das ganze Designtechnisch schön auf Threads zu verlagern =). Die Funktion muss ich mir mal genauer anschauen. Kenns nur von den Zylom Games ^^.

Mein Programm läuft nicht als Dienst, ich dachte dafür ist der Ausmaß nicht groß genug. Ist ja nur ein kleiner Aufsatz. Aber interessant wäre es schon, das ganze als Service laufen zu lassen. Also, wenn ich das richtig verstanden habe und mein Programm als Service registriere, habe ich immer Zugriff auf die anderen Prozesse, auch wenn z.B. Strg-Alt-Entf bei Vista gedrückt wird.

Ergo, könnte ich permanent daraus lesen und müsste keine Befürchtungen mehr haben, dass da was schief geht. Könnte dann auch den GetExitCodeProcess wegfallen lassen und nur noch auf ERROR_ACCESS_DENIED reagieren.

Also, wenn ich das so hinbekomme - hab ja das Windows SDK -, dass das möglich ist, hab ich mir einen Programmschritt gespart. Hat es denn Nachteile einen Service zu führen ? Oder nur Vorteile ? Kenn mich mit Services nicht so aus, schalte ledigliche bei XP ein paar unnötige ab =), aber bei Vista lass ich alles schön wie es ist, bis ich das System näher kennen lerne.

Ihr seid cool ^^ erst war ich verzweifelt, weil ich auf Antwort hoffte, und jetzt werden mir viele Vorschläge zur Verbesserung gemacht.

Wie schauts eigentlich mit der Freeware-Sektion aus ? Da könnt ich doch mein kleines Tool präsentieren, oder ? Natürlich um ein paar Verbesserungsvorschläge einzukassieren ^^.

Gruß Angelo
"Wenn du nicht bereit bist, für eine Sache zu sterben, dann solltest du Freiheit aus deinem Vokabular streichen" - Malcolm X
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#8

Re: Problem mit ReadProcessMemory unter Vista

  Alt 27. Aug 2007, 00:10
Zitat von KarYn-To:
Mit WaitForSingleObject kann ich aber nur einen Prozess gleichzeitig überwachen oder ? Oder ich mach das ganze über Threads, jede Prozessüberwachung ein Thread. Dann wäre das möglich, das ganze Designtechnisch schön auf Threads zu verlagern =). Die Funktion muss ich mir mal genauer anschauen. Kenns nur von den Zylom Games ^^.
Ein Thread reicht: WaitForMultipleObjects
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#9

Re: Problem mit ReadProcessMemory unter Vista

  Alt 27. Aug 2007, 00:41
Der Nachteil beim Service ist, dass ein Administrator ihn erstmal installieren muss. Also nicht jeder beliebige Benutzer kann ihn installieren - ist aber auch ein Sicherheitsvorteil.
Ein Vorteil ist (wenn man es einprogrammiert), dass man einen Dienst nicht einfach abschalten kann. D.h. der Dienst kann das Beenden verweigern. Ok ein Admin (oder Debugger Benutzer) kann ihn jedoch immer abschießen. Ein zweiter Dienst könnte den ersten jedoch überwachen und neustarten. Wenn man das richtig macht, dann wirds schwierig die Dienste zu beenden

Ein Dienst im Systemkonto hat wirklich überall Zugriff (bis auf mehr oder weniger Hardware). In Vista ist es jedoch so, dass man über einen Dienst keine Fenster auf den Benutzerdesktop mehr ausgeben kann. (außer MessageBox mit MB_SERVICE_NOTIFICATION)

Ein Systemdienst hat nicht automatisch überall Zugriff. Wenn z.b. eine Datei so angelegt wurde, dass der Benutzer "SYSTEM" den Zugriff verweigert bekommt, dann kann man die Datei auch nicht öffnen.
Man muss dann erstmal den Besitzer ändern, um dann die Zugriffs Kontroll Liste (ACL) für SYSTEM anzupassen. Erst dann kann man auf die Datei erfolgreich zugreifen.
Dasselbe gilt auch für Prozesse, denn die haben auch eine ACL. Man braucht sich jedoch keine Sorgen machen, da SYSTEM dort automatisch vollen Zugriff hat.

Da gibts noch ganz andere spassige Sachen


Hier im Forum gibts übrigens eine Sparte für Programme zur Veröffentlichung. Kannste ja mal was posten.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Antwort Antwort


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 07:30 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