AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

EnumProcesses

Ein Thema von Luckie · begonnen am 4. Dez 2004 · letzter Beitrag vom 11. Sep 2009
Antwort Antwort
Seite 2 von 3     12 3   
w3seek
(Gast)

n/a Beiträge
 
#11

Re: EnumProcesses

  Alt 4. Dez 2004, 15:00
nein, das ganze funktioniert mit NtQuerySystemInformation().

Ich hab mal die Funktion EnumProcesses in Delphi nachgebaut, so oder sehr Aehnlich duerfte sie Microsoft implementiert haben:

Delphi-Quellcode:
const
  SystemProcessInformation = 5;

  STATUS_INFO_LENGTH_MISMATCH = Integer($C0000004);

type
  UNICODE_STRING = record
    Length: Word;
    MaximumLength: Word;
    Buffer: PWideChar;
  end;
  PUNICODE_STRING = ^UNICODE_STRING;
  TUNICODE_STRING = UNICODE_STRING;

  _SYSTEM_PROCESS_INFORMATION = record
    NextEntryOffset: ULONG;
    NumberOfThreads: ULONG;
    SpareLi1, SpareLi2, SpareLi3: TLargeInteger;
    CreateTime, UserTime, KernelTime: TLargeInteger;
    ImageName: UNICODE_STRING;
    BasePriority: ULONG;
    UniqueProcessId: THandle;
    InheritedFromUniqueProcessId: THandle;
    HandleCount: ULONG;
    SessionId: ULONG;
    SpareUl3: ULONG;
    PeekVirtualSize: ULONG;
    VirtualSize: ULONG;
    PageFaultCount: ULONG;
    PeakWorkingSetSize: ULONG;
    WorkingSetSize: ULONG;
    QuotaPeakPagedPoolUsage: ULONG;
    QuotaPagedPoolUsage: ULONG;
    QuotaPeakNonPagedPoolUsage: ULONG;
    QuotaNonPagedPoolUsage: ULONG;
    PagefileUsage: ULONG;
    PeakPagefileUsage: ULONG;
    PrivatePageCount: ULONG;
  end;
  TSYSTEM_PROCESS_INFORMATION = _SYSTEM_PROCESS_INFORMATION;
  PSYSTEM_PROCESS_INFORMATION = ^TSYSTEM_PROCESS_INFORMATION;

function NtQuerySystemInformation(SystemInformationClass: Cardinal;
                                  SystemInformation: Pointer;
                                  Length: ULONG;
                                  ResultLength: PULONG): Integer; stdcall; external 'ntdll.dll';
function RtlNtStatusToDosError(StatusCode: Integer): DWORD; stdcall; external 'ntdll.dll';

function EnumProcesses(pProcessIds: PDWORD; cb: DWORD; var pBytesReturned: DWORD): BOOL; stdcall;
const
  BUF_SIZE = $10000;
var
  ProcListBuffer: PChar;
  ProcessInfo: PSYSTEM_PROCESS_INFORMATION;
  ProcOffset: ULONG;
  BufSize: Cardinal;
  Status: Integer;
begin
  Result := false;

  // capture the process list
  BufSize := BUF_SIZE;
  repeat
    GetMem(ProcListBuffer, BufSize);
    if ProcListBuffer = nil then
    begin
      SetLastError(ERROR_NOT_ENOUGH_MEMORY);
      Exit;
    end;

    Status := NtQuerySystemInformation(SystemProcessInformation,
                                       ProcListBuffer,
                                       BufSize,
                                       nil);
    if Status = STATUS_INFO_LENGTH_MISMATCH then
    begin
      // Buffer was too small, increase the buffer size and try again
      FreeMem(ProcListBuffer);
      Inc(BufSize, BUF_SIZE);
    end
    else if Status < 0 then
    begin
      // Another error occured
      FreeMem(ProcListBuffer);
      SetLastError(RtlNtStatusToDosError(Status));
      Exit;
    end;
  until Status >= 0;

  pBytesReturned := 0;

  // we got the entire process list now, extract all PIDs
  ProcOffset := 0;
  ProcessInfo := PSYSTEM_PROCESS_INFORMATION(ProcListBuffer);
  while cb >= SizeOf(DWORD) do
  begin
    ProcessInfo := PSYSTEM_PROCESS_INFORMATION(Cardinal(ProcessInfo) + ProcOffset);
    pProcessIds^ := DWORD(ProcessInfo^.UniqueProcessId);
    ProcOffset := ProcessInfo^.NextEntryOffset;
    Inc(pProcessIds);
    Dec(cb, SizeOf(DWORD));
    Inc(pBytesReturned, SizeOf(WORD));

    if ProcOffset = 0 then
    begin
      Result := true;
      Break;
    end;
  end;

  FreeMem(ProcListBuffer);
end;
wie man erkennen kann, enthaelt die SYSTEM_PROCESS_INFORMATION structure ein Feld namens ImageName, welches ein unicode string ist, den den Prozessnamen (also den Dateinamen des Images des Prozesses) enthaelt. Das Feld Buffer in diesem Unicode string zeigt einfach auf das Ende der structure die gerade enumeriert wurde, deshalb gibt es auch ein Feld NextEntryOffset um den Beginn der naechsten structure finden zu koennen.

Der Task Manager, die PSAPI implementierung von EnumProcesses() und auch die Toolhelp32 API (welche ich fast komplett fuer ReactOS geklont habe und auch unter WinNT funktioniert) verwenden alle diese sehr nuetzliche Funktion

Hoffe das bringt etwas mehr Licht in die duesteren APIs von Windows
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: EnumProcesses

  Alt 4. Dez 2004, 16:48
Hast du mal eben eine Demo dazu?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
w3seek
(Gast)

n/a Beiträge
 
#13

Re: EnumProcesses

  Alt 4. Dez 2004, 16:53
Zitat von Luckie:
Hast du mal eben eine Demo dazu?
Zu was genau? Zur Verwendung dieser Funktion? Einfach so aufrufen wie EnumProcesses von PSAPI
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: EnumProcesses

  Alt 4. Dez 2004, 17:03
Wie stellst du dir jetzt vor kommt man an den Modulnamen dran?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
w3seek
(Gast)

n/a Beiträge
 
#15

Re: EnumProcesses

  Alt 4. Dez 2004, 17:11
geb mir ein paar minuten ich bau mal eben ein beispiel programm
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: EnumProcesses

  Alt 4. Dez 2004, 17:15
Äh, ich dachte das wäre schonm da. Irgendiwe musst du die Funktion ja entwickelt haben.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
w3seek
(Gast)

n/a Beiträge
 
#17

Re: EnumProcesses

  Alt 4. Dez 2004, 17:37
Das was ich entwickelt hatte ist nur dazu da um zu sehen wie EnumProcesses implementiert ist, denn damit kann man sehr sehr viel anfangen:

hier das Beispielprogramm das darauf basiert als Anhang
Angehängte Dateien
Dateityp: zip process_525.zip (3,1 KB, 119x aufgerufen)
  Mit Zitat antworten Zitat
w3seek
(Gast)

n/a Beiträge
 
#18

Re: EnumProcesses

  Alt 6. Dez 2004, 10:21
nur des Feedbacks wegen, verstanden wie das funktioniert?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: EnumProcesses

  Alt 6. Dez 2004, 13:29
Ich bin noch nicht dazu gekommen, mir das anzugucken. Ich hatte gerade am Sonntag noch Zeit mir das mal runterzuladen und schnell mal zu starten und bin gerade erst nach hause gekommen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
w3seek
(Gast)

n/a Beiträge
 
#20

Re: EnumProcesses

  Alt 6. Dez 2004, 13:39
Zitat von Luckie:
Ich bin noch nicht dazu gekommen, mir das anzugucken. Ich hatte gerade am Sonntag noch Zeit mir das mal runterzuladen und schnell mal zu starten und bin gerade erst nach hause gekommen.
wie war die sauf... aehm trinktour? nur spass
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 12:44 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