AGB  ·  Datenschutz  ·  Impressum  







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

EnumProcesses

Ein Thema von Luckie · begonnen am 4. Dez 2004 · letzter Beitrag vom 11. Sep 2009
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Luckie
Luckie

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

EnumProcesses

  Alt 4. Dez 2004, 04:13
Ich versuche gerade eine Prozessliste mit EnumProcesses zu bekommen. Ich habe da schon eine funktionierden Version auf meiner HP, wollte es aber besser machen:
Delphi-Quellcode:
function GetProcessList(out ProcessList: TProcessList): DWORD;

  function GetOSVersionInfo(var Info: TOSVersionInfo): Boolean;
  begin
    FillChar(Info, SizeOf(TOSVersionInfo), 0);
    Info.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
    Result := GetVersionEx(TOSVersionInfo(Addr(Info)^));
    if (not Result) then
    begin
      FillChar(Info, SizeOf(TOSVersionInfo), 0);
      Info.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
      Result := GetVersionEx(TOSVersionInfo(Addr(Info)^));
      if (not Result) then
        Info.dwOSVersionInfoSize := 0;
    end;
  end;

var
  OSInfo : TOSVersionInfo;
  PidProcesses : PDWORD;
  PidWork : PDWORD;
  BufferSize : Cardinal;
  cbNeeded : Cardinal;
  cntProcesses : Cardinal;
  i : Cardinal;

begin
  result := 0;

  // What OS are we running on?
  if GetOSVersionInfo(OSInfo) then
  begin
    if (OSInfo.dwPlatformId = VER_PLATFORM_WIN32_NT) and (OSInfo.dwMajorVersion =
      5) then
    // WinNT and higher
    begin
      cbNeeded := 0;
      BufferSize := 0;
      // how much memory do we need
      if EnumProcesses(nil, BufferSize, cbNeeded) then
      begin
        cntProcesses := cbNeeded div sizeof(DWORD);
        GetMem(PidProcesses, cntProcesses);
        if EnumProcesses(PidProcesses, cntProcesses, cbNeeded) then
        begin
          PidWork := PidProcesses;
          setlength(ProcessList, cntProcesses);
          for i := 0 to cntProcesses - 1 do
          begin
            ProcessList[i] := PidWork^;
            Inc(PidWork, sizeof(PDWORD));
          end;
        end;
        FreeMem(PidProcesses, cntProcesses);
      end;
    end
    // Win 9x and higher except WinNT
    else
    begin
    end;
  end;
end;
Im PSDK steht:
Zitat:
To determine how many processes were enumerated by the call to EnumProcesses, divide the resulting value in the cbNeeded parameter by sizeof(DWORD).
Ich dachte mit dem ersten Aufruf füllt er mir cbNeeded. Tut er aber nicht, ist immer null.

Mache ich es so:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  pdwResult : PDWORD; // für den Buffer
  pdwWork : PDWORD; // um dem Buffer verarbeiten zu können
  dwCountIn : DWORD; // Grösse des Buffers in Byte
  dwCountOut : DWORD; // Zurückgelieferte Anzahl Byte
  i : integer;
begin
  dwCountOut := 0; // Sicherheitshalber initialisieren, muss nicht sein
  dwCountIn := 1024; // Willkürlich gewählt, genügt für 256 Prozesse
  pdwResult := AllocMem(dwCountIn);
  try
    if not EnumProcesses(pdwResult,dwCountIn,dwCountOut) then begin
      RaiselastOSError();
    end else begin
      pdwWork := pdwResult; // zur Verarbeitung übergeben, damit FreeMem funktioniert
      for i := 1 to (dwCountOut shr 2) do begin // shr 2 = / 4, da 4 Byte je DWORD
        // Prozess Id ausgeben
        //ShowMessage('ProzessId# '+IntToStr(i)+': '+IntToStr(pdwWork^));
        ListBox1.Items.Add(GetProcessName(pdwWork^));
        // auf nächste addressieren (inc erhöht automatisch um 4, da es ein typisierter Pointer ist
        inc(pdwWork);
      end;
    end;
  finally
    FreeMem(pdwResult,dwCountIn);
  end;
end;
Dann geht es. Nur finde ich es etwas blöd unnötig Speicher zu reservieren.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#2

Re: EnumProcesses

  Alt 4. Dez 2004, 04:50
Es steht aber auch so in der Hilfe, das du keine Möglichkeit hast zu ermitteln wieviel Speicher du wirklich brauchst. Sondern das du ausreichend Speicher reservieren sollst. Von daher finde ich das C Beispiel in dem Platform SDK ganz gut.
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: EnumProcesses

  Alt 4. Dez 2004, 04:57
Gut, wenn sie es nicht anders wollen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: EnumProcesses

  Alt 4. Dez 2004, 06:13
OK. So sieht es jetzt aus: http://www.luckie-online.de/Delphi/S...zessliste.html
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
w3seek
(Gast)

n/a Beiträge
 
#5

Re: EnumProcesses

  Alt 4. Dez 2004, 13:33
Zwei Fehler:
1. Der Versionscheck funktioniert mit NT 4 da es = 4 anstatt >= 4 testet
2. OpenProcess() zu verwenden um den Dateinamen des Prozesses zu verwenden ist nicht zuverlaessig weil man ggf. nicht die noetigen Rechte hat (sieht man an den "unbekannt" eintraegen in der liste

Ich werde ein Beispiel wie M$ diese Funktion implementiert hat mit Hilfe der native API hier posten, denn die liefert eigentlich schon genug Informationen, inkl. der Dateinamen fuer alle Prozesse. Die NAPI funktionen sind zwar undokumentiert von M$, aber sie sind in einigen Buechern gut dokumentiert und haben sich ausserdem seit NT 4 nicht geaendert, unwahrscheinlich also dass sie jemals geaendert werden. Ausserdem gibt es eine Reihe von Programmen wie der TaskManager die auf diese Methode zurueckgreifen.

[edit: ich seh gerade dass das neueste PSDK diese funktionen doch dokumentiert hat]
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: EnumProcesses

  Alt 4. Dez 2004, 13:49
Zitat von w3seek:
Zwei Fehler:
2. OpenProcess() zu verwenden um den Dateinamen des Prozesses zu verwenden ist nicht zuverlaessig weil man ggf. nicht die noetigen Rechte hat (sieht man an den "unbekannt" eintraegen in der liste
Das würde ich nicht als Fehler sehen.

Zitat:
Die NAPI funktionen sind zwar undokumentiert von M$, aber sie sind in einigen Buechern gut dokumentiert
Diese Bücher habe ich leider nicht.

Zitat:
und haben sich ausserdem seit NT 4 nicht geaendert, unwahrscheinlich also dass sie jemals geaendert werden.
Trotzdem sollte man sich nicht darauf verlassen.

Zitat:
Ausserdem gibt es eine Reihe von Programmen wie der TaskManager die auf diese Methode zurueckgreifen.
Der ist ja auch von MS selber.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#7

Re: EnumProcesses

  Alt 4. Dez 2004, 13:59
Zitat von w3seek:
OpenProcess() zu verwenden um den Dateinamen des Prozesses zu verwenden ist nicht zuverlaessig weil man ggf. nicht die noetigen Rechte hat (sieht man an den "unbekannt" eintraegen in der liste
Mit AdminRechte bekommt man in dem Beispiel von Luckie nur ein Unbekannt. Und das liegt daran, das der Leerlaufprozess nun maö keinen Namen hat.

Zitat:
ich seh gerade dass das neueste PSDK diese funktionen doch dokumentiert hat]
Dann hättest du dir die Funktion gleich genauer anschauen können, dann hättest du auch gesehen, das man dafür auch einen ProcessHandle braucht.
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
w3seek
(Gast)

n/a Beiträge
 
#8

Re: EnumProcesses

  Alt 4. Dez 2004, 14:04
Zitat von Sprint:
Dann hättest du dir die Funktion gleich genauer anschauen können, dann hättest du auch gesehen, das man dafür auch einen ProcessHandle braucht.
nein, braucht man nicht. Dieser weg duerfte sogar mit sehr eingeschraenkten Rechten funktionieren. die toolhelp api benutzt uebrigens den gleichen Weg.

Die Wahrscheinlich dass diese Funktionen geaendert werden geht gegen null, erstens wurden sie endlich von M$ dokumentiert und zweitens benoetigen viele Programme, insbesondere Virenscanner und Firewalls diese Funktion...

gebt mir noch ein paar Miuten...
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: EnumProcesses

  Alt 4. Dez 2004, 14:06
Wie heißen denn die Funktionen?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#10

Re: EnumProcesses

  Alt 4. Dez 2004, 14:08
Zitat von Luckie:
Wie heißen denn die Funktionen?
Code:
NTSTATUS NtQueryInformationProcess(
  HANDLE ProcessHandle,
  PROCESSINFOCLASS ProcessInformationClass,
  PVOID ProcessInformation,
  ULONG ProcessInformationLength,
  PULONG ReturnLength
);
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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:54 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