Если интересно - пожалуйста. Тут по одной кнопке вызывается код Математика, по другой - моя функция. Но свой путь в WinAPI я только начинаю, так что это очень и очень далекий от совершенства код.
По щелчку на процесс в списке выводится информация о его модулях в другом списке.
| Код | unit uprocesses;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, psapi;
type
TProcess=record ID:dword; Desc:DWORD; name:string; ModCount:integer; Mods:array of DWORD; ModsName:array of string;
end;
TForm1 = class(TForm) Button1: TButton; ListBox1: TListBox; Memo1: TMemo; Button2: TButton; ListBox2: TListBox; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure ListBox1Click(Sender: TObject); private procedure GetProcesses; procedure GetPIDs; procedure GetModules(i:integer); { Private declarations } public { Public declarations } end;
var Form1: TForm1; pr:array of Tprocess; PrCount:DWORD; implementation
{$R *.DFM}
procedure TForm1.GetModules(i:integer);//èíäåêñ â ìàññèâå pr var hProcess:DWORD; j:integer; needed:DWORD; begin pr[i].desc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,False, pr[i].id);
if pr[i].desc=0 then exit;
pr[i].modcount:=15; repeat needed:=0; pr[i].modcount:=pr[i].modcount*2; SetLength(pr[i].mods,pr[i].modcount); EnumProcessModules(pr[i].desc, @(pr[i].mods[0]), pr[i].modcount*sizeof(DWORD), needed); until needed<pr[i].modcount*sizeof(DWORD);
pr[i].modcount:=needed div 4; SetLength(pr[i].mods,pr[i].modcount); SetLength(pr[i].modsname,pr[i].modcount);
if pr[i].modcount>0 then begin for j:=0 to pr[i].modcount-1 do begin SetLength(pr[i].modsname[j],MAX_PATH-1); needed:=0; needed:=GetModuleBaseName(pr[i].desc, pr[i].mods[j], pchar(pr[i].modsname[j]), length(pr[i].modsname[j])); SetLength(pr[i].modsname[j],needed); end; end;
CloseHandle(pr[i].desc); end;
procedure TForm1.GetPIDs; var needed,i:DWORD; prids:array of DWORD; begin prcount:=15; repeat needed:=0; prcount:=prcount*2; SetLength(prids,prcount); EnumProcesses(@prids[0],prcount*sizeof(DWORD),needed); until needed<prcount*sizeof(DWORD); prcount:=needed div sizeof(DWORD); SetLength(pr,prcount); for i:=0 to prcount-1 do pr[i].id:=prids[i];
end;
Function CreateWinNTProcessList:AnsiString; var PIDArray : array [0..1023] of DWORD; cb : DWORD; I : Integer; ProcCount : Integer; hMod : HMODULE; hProcess : THandle; ModuleName : array [0..1024] of Char; begin result := ''; EnumProcesses(@PIDArray, SizeOf(PIDArray), cb); ProcCount := cb div SizeOf(DWORD); for I := 0 to ProcCount - 1 do begin hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,False,PIDArray[I]); if (hProcess <> 0) then begin if PIDArray[I]=4 then begin result := result + inttostr(PIDArray[I]) + ' System'+chr(13)+chr(10); end else begin EnumProcessModules(hProcess, @hMod, SizeOf(hMod), cb); GetModuleFilenameEx(hProcess, hMod, ModuleName, SizeOf(ModuleName)); result := result + inttostr(PIDArray[I]) + ' ' + ModuleName+chr(13)+chr(10); end end; CloseHandle(hProcess) end end;
procedure TForm1.GetProcesses; var Needed:DWORD; PrIDs:array of DWORD; h,i,j,n:integer; b:boolean; begin listbox1.items.clear;
getpids;
for i:=0 to prcount-1 do begin getmodules(i); if pr[i].ModCount >0 then listbox1.items.Add(inttostr(pr[i].id)+' '+pr[i].modsname[0]) else listbox1.items.Add(inttostr(pr[i].id)+' cant open, it is system process'); end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin memo1.text:=CreateWinNTProcessList; //GetProcesses; end;
procedure TForm1.Button2Click(Sender: TObject); begin getprocesses; end;
procedure TForm1.ListBox1Click(Sender: TObject); var i:integer; begin listbox2.items.clear; for i:=0 to pr[listbox1.ItemIndex].modcount-1 do listbox2.items.add(pr[listbox1.ItemIndex].modsname[i]);
end;
end.
|
Много пока непонятно. Например вот у меня вопрос - я не могу открыть (OpenProcess) некоторые процессы - csrss.exe, svchost и др. Как бы их все-таки открывать? Spy++ это делает. Или хотя бы как понять, что это за процесс? svchost'ов к примеру может быть несколько и по id их отличать не получается. |