想要一个取系统进程全路径的源代码.....(205)

  • 主题发起人 主题发起人 SuKiDelphi
  • 开始时间 开始时间
S

SuKiDelphi

Unregistered / Unconfirmed
GUEST, unregistred user!
一直想做一个可以取"系统进程全路径....."的功能..但因有些程序勾了"OpenProcess", 所以用"OpenProcess"或 CreateToolhelp32Snapshot(module32first) 都不能取出进程的全路径,在网上找了很久, 只找到一个用打开"CSRSS.EXE",再ZwDuplicateObject 等等获得其句柄"的方法可以取进程的全路径(不用驱动的情况下), 但源代码是VC++的, 我不会在delphi 声明..只要能取进程全路径的(勾了"OpenProcess"的情况下), 马上给分(分时少了点, 但我只有这些了)!!!!谢谢!!!!!!!!!!!(希望能和大家交个朋友)
 
得到系统进程和路径unit Unit1;interfaceusesWindows,Tlhelp32, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ComCtrls, psapi;typeTForm1 = class(TForm) ListView1: TListView; Button1: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject);private { Private declarations }public { Public declarations }end;varForm1: TForm1;implementation{$R *.dfm}function GetProcessPath(ProcessID: DWORD): string;var Hand: THandle; ModName: Array[0..Max_Path-1] of Char; hMod: HModule; n: DWORD;begin Result:=''; Hand:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ProcessID); if Hand>0 then try ENumProcessModules(Hand,@hMod,Sizeof(hMod),n); if GetModuleFileNameEx(Hand,hMod,ModName,Sizeof(ModName))>0 then // Result:=ExtractFilePath(ModName);//得到路径 Result:=ModName; //得到路径和文见名 except end;end;procedure TForm1.Button1Click(Sender: TObject);varfound:boolean; //定义枚举进程所需变量NewItem: TListItem;FSnapshotHandle:tHANDLE;lppe:TProcessEntry32;beginwith listview1 dobeginColumns.Add;Columns.Add;Columns.Add;ViewStyle:=vsreport;GridLines:=true;columns.items[0].caption:='映像名称';columns.items[1].caption:='进程ID';columns.items[2].caption:='映像路径';Columns.Items[0].Width:=100;Columns.Items[1].Width:=50; //初始化listviewColumns.Items[2].Width:=300;end;ListView1.Items.BeginUpdate;ListView1.Items.Clear;FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //CreateToolhelp32Snapshot函数得到进程快照lppe.dwSize := Sizeof(lppe); //初始化found := Process32First(FSnapshotHandle, lppe); //Process32First 得到一个系统快照里第一个进程的信while found do begin NewItem := ListView1.Items.Add; //在ListView1显示 NewItem.ImageIndex := -1; NewItem.Caption := ExtractFileName(lppe.szExeFile);//进程名称 NewItem.subItems.Add(IntToStr(lppe.th32ProcessID));//进程ID NewItem.subItems.Add(GetProcessPath(lppe.th32ProcessID)); found := Process32Next(FSnapshotHandle, lppe);end;CloseHandle(FSnapshotHandle);ListView1.Items.EndUpdate;self.Label1.Caption:='当前系统共有'+''+inttostr(listview1.Items.count)+''+'个进程 ' ;end;end.
 
勾了"OpenProcess"的情况下
 
function GetProcessModuleFile(hProcess:THandle;hMod:HMODULE):string;begin SetString(Result,nil,MAX_PATH); if GetModuleFileNameExA(hProcess,hMod,PAnsiChar(Result),MAX_PATH)<=0 then Result:='';end;procedure GetProcesses(Strings:TStrings);var arrProcessID:array [0..100] of DWORD; ProcessCount:Cardinal; hProcess:THandle; I:Integer;begin Strings.Clear; if EnumProcesses(@arrProcessID[0],101,ProcessCount) then for I:=0 to ProcessCount-1 do begin hProcess:=OpenProcess(PROCESS_VM_READ or PROCESS_QUERY_INFORMATION,False,arrProcessID); if hProcess<>0 then begin Strings.AddObject(GetProcessModuleFile(hProcess,0),TObject(hProcess)); //CloseHandle(hProcess); {因为已经把进程句柄加入到Strings中备用了,所以这里不释放句柄,不过GetProcesses函数的调用者要负责释放这些句柄} end; end;end;procedure GetModules(hProcess:THandle;Strings:TStrings);var arrModules:array [0..100] of HMODULE; ModuleCount:Cardinal; I:Integer;begin Strings.Clear; if EnumProcessModules(hProcess,@arrModules[0],101,ModuleCount) then for I:=0 to ModuleCount-1 do Strings.AddObject(GetProcessModuleFile(hProcess,arrModules));end;
 
谢谢hProcess:=OpenProcess(PROCESS_VM_READ or PROCESS_QUERY_INFORMATION,False,arrProcessID); if hProcess<>0 then // 别人勾了"OpenProcess"的情况下,这里就是 0, begin Strings.AddObject(GetProcessModuleFile(hProcess,0),TObject(hProcess)); //CloseHandle(hProcess); {因为已经把进程句柄加入到Strings中备用了,所以这里不释放句柄,不过GetProcesses函数的调用者要负责释放这些句柄} end;
 
在这里, 看来没希望了!!!
 
啊哦, 现在的神牛们,, 看贴都太不自信了。。虽然我不会,但是, 楼主都说了。。 勾了"OpenProcess"的情况下!!!!
 
自已解决了, 谢谢大家
 
后退
顶部