Compago

...free knowledge

 
  • Increase font size
  • Default font size
  • Decrease font size
Home Manuali Programmazione Elencare i processi e i loro moduli

Elencare i processi e i loro moduli

E-mail Stampa PDF

Per elencare i processi nei sistemi NT o successivi si usa la funzione EnumProcess, la quale riempirà un vettore di dword con i pid dei vari processi in esecuzione. In modo analogo useremo la funzione EnumProcessModules per creare un elenco dei moduli eseguibili caricati nel processo. Anche in questo caso verrà fornito un vettore che la funzione penserà a riempire con gli handles ai moduli.

Il primo modulo è l'eseguibile stesso mentre gli altri sono le librerie che esso caricherà in memoria.

Per ottenere invece i nomi dei file corrispondenti ai moduli in memoria si usa la funzione GetModuleFilenameEx, la quale, avendo l'handle del processo e quello del modulo, restituisce il nome del relativo file.

Attenzione alla differenza tra handle al processo e PID, infatti quest'ultimo è un identificativo unico per ogni processo ma non può essere usato nelle funzioni di cui abbiamo parlato prima, per cui sarà necessario ottenere un handle al processo usando la funzione OpenProcess e fornendogli il PID.

uses
  Psapi, tlhelp32;
 
procedure CreateWinNTProcessList(List: TstringList);
var
  PIDArray: array [0..1023] of DWORD;
  cb: DWORD;
  I,J: Integer;
  ProcCount,ModCount: Integer;
  hMod: array [0..255] of HMODULE;
  hProcess: THandle;
  ModuleName: array [0..300] of Char;
begin
  if List = nil then Exit;
  //recupera informazioni sui processi in esecuzione inserendoli in un array
  EnumProcesses(@PIDArray, SizeOf(PIDArray), cb);
  ProcCount := cb div SizeOf(DWORD);
  for I := 0 to ProcCount - 1 do begin
    //recupera l'handle del processo usando il suo PID
    hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or
                            PROCESS_VM_READ,
                            False,
                            PIDArray[I]);
    if (hProcess <> 0) then begin
      //recupera informazioni sui moduli di un processo
      //un array di HMODULE verrà riempito con gli handles dei vari moduli
      EnumProcessModules(hProcess, @hMod, SizeOf(hMod), cb);
 
      //il primo modulo  l'eseguibile del processo
      GetModuleFilenameEx(hProcess, hMod[0], ModuleName, SizeOf(ModuleName));
      List.Add(ModuleName);
 
      //gli altri moduli sono le lue librerie
      ModCount:= cb div SizeOf(HMODULE);  //conta gli elementi validi del vettore
      for J := 1 to ModCount - 1 do begin
        GetModuleFilenameEx(hProcess, hMod[j], ModuleName, SizeOf(ModuleName));
        List.Add('   '+ModuleName);
      end;
      //rilascia l'handle del processo
      CloseHandle(hProcess);
    end;
  end;
end;
 
Ultimo aggiornamento ( Sabato 07 Agosto 2010 16:39 )  
Loading

Login