Home | Chi sono | Contattami
 

Progr. lineare

Delphi
 
Componenti
  Database
 
Miei articoli

Windows

Miei articoli 

 

Elencare Processi, Threads e Moduli


Esistono diversi modi per enumerare i processi (e assieme a loro, moduli caricati, threads creati, etc.. etc..). Nel seguito viene descritta una delle tecniche più usate ossia ricorrere alla cosidetta Tool Help Library. In Delphi tutto ciò che riguarda questa libraria è incluso nella unit pascal TlHelp32.

1. Tool Help Library

Sotto il nome di Tool Help Library vengono raccolte delle API win32 implementate in kernel32.dll che si occupano di restituire informazioni relativamente a processi, moduli caricati, thread e heap di memoria. Ho volutamente evitato di fare una descrizione dettagliata delle strutture dati usate dalle varie funzioni (per la quali rimando ovviamente al Platform SDK) in quanto ritengo che questo sia uno di quei contesti in cui un esempio valga più di tanti schemi.

1.1 CreateToolhelp32Snapshot

L'api win32 CreateToolhelp32Snapshot è il fulcro di tutta la Tool Help Library. Vediamola nel dettaglio

function TCreateToolhelp32Snapshot(dwFlags: Cardinal, th32ProcessID: Cardinal ): Cardinal; stdcall;

dwFlags: rappresenta il tipo di informazione che deve essere restituita

const TH32CS_SNAPHEAPLIST = $00000001; TH32CS_SNAPPROCESS = $00000002; TH32CS_SNAPTHREAD = $00000004; TH32CS_SNAPMODULE = $00000008; TH32CS_SNAPALL = TH32CS_SNAPHEAPLIST or TH32CS_SNAPPROCESS or TH32CS_SNAPTHREAD or TH32CS_SNAPMODULE; TH32CS_INHERIT = $80000000;

  • TH32CS_SNAPPROCESS: elenco dei processi.
  • TH32CS_SNAPTHREAD: elenco dei thread
  • TH32CS_SNAPMODULE: elenco dei moduli del processo specificato da th32processid
  • TH32CS_INHERIT: l' handle restituito dalla funzione è ereditabile
  • TH32CS_SNAPALL: tutte le informazioni precedenti

th32ProcessId: rappresenta il Process Id (PID) del processo di cui si vogliono analizzare le caratteristiche (Threads, moduli caricati, etc...): settato a 0 indica il processo corrente; E' da notare che questo parametro è usato quando sono specificati come dwFlags i seguenti valori: TH32CS_SNAPHEAPLIST, TH32CS_SNAPMODULE, or TH32CS_SNAPALL. In caso contrario è ignorato.

La funzione restituisce un Handle allo snapshot (fotografia istantanea) del sistema.

Alla fine si chiude l' Handle con una chiamata a CloseHandle(Handle)

Ora non rimane altro che crearsi un'applicazione minimale ed esporre degli esempi di utilizzo: creiamo ora una Form e mettiamoci un TMemo ed un TButton ed andiamo ad implementare le procedure per elencare Processi, Threads e Moduli.
 

2. Elenco processi

procedure TForm1.ElencoProcessi(); var pe: TProcessEntry32; hSnap: THandle; begin hSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); Memo1.Lines.Add('//////////////////// Elenco Processi ////////////////////////////'); pe.dwSize := sizeof(TProcessEntry32); //Prelevo informazioni sul primo processo nello snapshot di sistema Process32First(hSnap, pe); repeat //loop sui processi with pe do begin Memo1.Lines.Add(szExeFile); Memo1.Lines.Add(' Numero di riferimenti al processo: ' + IntToStr(cntUsage)); Memo1.Lines.Add(' Process Id: ' + IntToStr(th32ProcessID)); Memo1.Lines.Add(' Numero di Threads lanciati dal processo: ' + IntToStr(cntThreads)); Memo1.Lines.Add(' Process Id del processo padre: ' + IntToStr(th32ParentProcessID)); Memo1.Lines.Add(' Priorità base di ogni thread lanciato dal processo: ' + IntToStr(pcPriClassBase)); Memo1.Lines.Add(''); end; until (not (Process32Next(hSnap, pe))); CloseHandle(hSnap); end;

3. Elenco threads di un processo

procedure TForm1.ElencoTreads(pid: DWORD); //pid: Process Id del processo di cui si vogliono enumerare i thread var te: TThreadEntry32; hSnap: THandle; begin hSnap := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); Memo1.Lines.Add('//////////////////// Elenco Threads ////////////////////////////'); te.dwSize := sizeof(TThreadEntry32); //Prelevo informazioni sul primo thread del processo in questione Thread32First(hSnap, te); repeat //loop sui thread with te do begin if (th32OwnerProcessID = pid) then begin Memo1.Lines.Add(' Numero di riferimenti al thread: ' + IntToStr(cntUsage)); Memo1.Lines.Add(' Thread Id: ' + IntToStr(th32ThreadID)); Memo1.Lines.Add(' Priorità base del thread: ' + IntToStr(tpBasePri)); end; until (not (Thread32Next(hSnap, te))); CloseHandle(hSnap); end;

4. Elenco moduli caricati nello spazio di memoria di un processo

procedure TForm1.ElencoModuli(pid); //pid: Process Id del processo di cui si vogliono enumerare i moduli var me: TModuleEntry32; hSnap: THandle; begin hSnap := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid); Memo1.Lines.Add('//////////////////// Elenco Moduli ////////////////////////////'); me.dwSize := sizeof(TModuleEntry32); //Prelevo informazioni sul primo modulo del processo in questione Module32First(hSnap, me); repeat //loop sui moduli with me do begin Memo1.Lines.Add(' Numero di riferimenti globali al modulo: ' + IntToStr(GlblcntUsage)); Memo1.Lines.Add(' Numero di riferimenti al modulo nel contesto del processo: ' + IntToStr(ProccntUsage)); Memo1.Lines.Add(' Module Id: ' + IntToStr(th32ModuleID)); Memo1.Lines.Add(' Process Id del processo padre: ' + IntToStr(th32ProcessID)); Memo1.Lines.Add(' Handle del modulo nel contesto del processo: ' + IntToStr(hModule)); Memo1.Lines.Add(' Nome del modulo: ' + szModule); Memo1.Lines.Add(' Path del modulo: ' + szExePath); Memo1.Lines.Add(' Dimensione in byte del modulo: ' + IntToStr(modBaseSize)); Memo1.Lines.Add(' Module Id: ' + IntToStr(th32ModuleID)); end; until (not (Module32Next(hSnap, me))); CloseHandle(hSnap); end;

 

 

 

 

 

 

 

 

 

 

 
 
Your Ad Here