AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Prozesse & Handles auslesen

Ein Thema von Leon421 · begonnen am 18. Feb 2010 · letzter Beitrag vom 19. Feb 2010
Antwort Antwort
Leon421

Registriert seit: 18. Feb 2010
2 Beiträge
 
Delphi 6 Personal
 
#1

Prozesse & Handles auslesen

  Alt 18. Feb 2010, 13:27
Hi, ich bin auf meiner Suche nach Möglichkeiten, mit Delphi laufende Prozesse auszulesen, auf dieses Forum gestoßen, und habe mehrere Implementationen gefunden.
Alle funktionieren mehr oder weniger gut, die folgende funktioniert in sofern am besten, dass sie öfter als nicht nur die Nutzerprozesse "sieht", und ohne weiteres Filtern eine ziemlich "saubere" Liste liefert.

Versuche ich jedoch, an den Handle heranzukommen (entweder direkt über ProzessHandle, oder über die eingefügte Funktion GetProcessHandleFromID) passiert etwas absonderliches.
Ich erhalte für jede ID das gleiche Handle. Entferne ich eine der fettgedruckten "Closehandle()" zeilen, so erhalte ich für jeden Prozess eine einzigartigen Handle, jedoch scheinen diese Handles zerstört zu werden, da bei der nächsten Iteration alle Handles größer sind als vorher.

Ich bin zwar neu hier, wäre aber trotzdem ausgesprochen dankbar, falls mir Jemand helfen könnte.


Hier ist der Quelltext, mehrere Varianten waren diesem sehr ähnlich. Ich weiss leider nicht mehr, wer der Author dieser Implementation ist.

Code:
procedure DoStuff;

    function GetProcessHandleFromID(ID: DWORD): THandle;
    begin
      result := OpenProcess(SYNCHRONIZE, False, ID);
      [b]CloseHandle(result);[/b]
    end;

    var PrIDs : array [0..1000] of DWORD;
        PrName : array [0..255] of Char;
        Bia : DWORD;
        i, PrCount : Integer;
        ProzessHandle : HWND;
        Modulhandle : HWND;
    begin
    PList:=TStringList.Create;
    HList:=TStringList.Create;
    if EnumProcesses(@PrIDs, SizeOf(PrIDs), bia) then begin
       if (Bia < sizeof(PrIDs)) then begin
          PrCount:=Bia div SizeOf(DWORD);
          for i:=0 to PrCount do begin
              ProzessHandle:=OpenProcess(PROCESS_QUERY_INFORMATION or
                                         PROCESS_VM_READ, False, PrIDs[i]);
              if (ProzessHandle <> 0) then begin
                 EnumProcessModules(ProzessHandle,
                                    @ModulHandle,
                                    SizeOf(modulhandle),
                                    Bia);
                 GetModuleFilenameEx(Prozesshandle,
                                     ModulHandle,
                                     PrName,
                                     SizeOf(PrName));
                 PList.Add(ExtractFileName(PrName));
                 HList.Add(IntToStr(GetProcesshandleFromID(PrIDs[i])));

                [b] CloseHandle(ProzessHandle);[/b]
              end;
          end; {for i}
       end else begin
          MessageDlg('PrID-Array zu klein', mtError, [mbOk], 0)
       end;
    end else begin
       RaiseLastOSError();
    end;
   end;
  Mit Zitat antworten Zitat
Dezipaitor

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

Re: Prozesse & Handles auslesen

  Alt 18. Feb 2010, 14:32
Handles sind nichts weiter als Nummern, die von deinem Prozess in einer Liste geführt werden. Durch diese Nummer kann Windows dann speziell für deinen Prozess herausfinden, welche Ressource (z.B. Prozess) gemeint ist.
Das bedeutet, dass ein Handle auch nicht übertragbar ist auf einen anderen Prozess, da dieser eine andere Handletabelle führt. So können zwei gleiche Handles aus unterschiedlichen Prozessen auf völlig andere Resourcen (z.b. Prozess und Datei) verweisen.

Wenn du mit CloseHandle diese Nummer aus der Handleliste entfernst, dann ist sie wertlos und kann nicht weiter verwendet werden.

Jedesmal wenn du eine Resource, wie einen Verweis auf einen Prozess, anforderst, vergibt Windows deinem Prozess so eine Nummer/Handle. Und das jedesmal von neuem, so dass Handles nicht einzigartig für eine Ressource sind. Es können gerne mehrere Handles auf denselben Prozess zeigen, obwohl sie nicht dieselben Nummern sind.
Deshalb gibt es ProzessIDs, die für jeden Prozess nur einmal vergeben werden und an OpenProcess übergeben werden.

So ist dein beobachtetes Verhalten zu erklären.

Achja, Willkommen in der Delphipraxis
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Leon421

Registriert seit: 18. Feb 2010
2 Beiträge
 
Delphi 6 Personal
 
#3

Re: Prozesse & Handles auslesen

  Alt 18. Feb 2010, 15:56
D.h. ich muss wohl den Autor der Unit die fürs Terminieren der Prozesse zuständig ist, überzeugen, Prozess-IDs statt handles zum terminieren zu akzeptieren?

Vielen Dank für die Erklärung!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Prozesse & Handles auslesen

  Alt 18. Feb 2010, 19:53
Zitat von Leon421:
D.h. ich muss wohl den Autor der Unit die fürs Terminieren der Prozesse zuständig ist, überzeugen, Prozess-IDs statt handles zum terminieren zu akzeptieren?
Wie so? Du musst das Handle nur benutzen bevor du es schließt:
Delphi-Quellcode:
function KillProcess(dwProcID, Wait: DWORD): Integer;
var
  hProcess : Cardinal;
  dw : DWORD;
begin
  // open the process and store the process-handle
  hProcess := OpenProcess(SYNCHRONIZE or PROCESS_TERMINATE, False, dwProcID);
  // kill it
  if hProcess <> 0 then
  begin
    dw := Integer(TerminateProcess(hProcess, 1));
    if dw <> 0 then
    begin
      // TerminateProcess returns immediately, so we have to verify the result via
      // WaitForSingleObject
      dw := WaitForSingleObject(hProcess, Wait);
      if dw = WAIT_FAILED then
        dw := GetLastError;
    end
    else // TerminateProcess = 0
      dw := GetLastError;
    CloseHandle(hProcess);
  end
  else // hProcess = INVALID_HANDLE_VALUE
    dw := GetLastError;
  result := dw;
end;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
viakt133

Registriert seit: 16. Feb 2010
18 Beiträge
 
Lazarus
 
#5

Re: Prozesse & Handles auslesen

  Alt 19. Feb 2010, 06:49
Hallo,

Mit der Funktion GetProcessHandleFromID() sollte es dann auch möglich sein, mit dem Prozess, dessen Handle ich dann ja habe auch zu kommunizieren? Aber wie? Habe hier schon die Frage aufgeworfen. Deshalb interessiert mich auch dieser thread.
  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 18:36 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