查看一个进程所调用的所有文件路径列表!
麻烦各位指点下:如果有一个进程比如qq.exe,我想查看它在运行过程中所涉及到的所有文件以及该文件的路径列表,像下图所示,不仅仅是它程序自己的模块,还包括所有调用的文件。只是显示dll以及exe这个不难做到,关键是所有文件。请各位老大指点小弟,急急急!!!!!!!不胜感激!类似下面这个程序的实现:
麻烦各位指点下:如果有一个进程比如qq.exe,我想查看它在运行过程中所涉及到的所有文件以及该文件的路径列表,像下图所示,不仅仅是它程序自己的模块,还包括所有调用的文件。只是显示dll以及exe这个不难做到,关键是所有文件。请各位老大指点小弟,急急急!!!!!!!不胜感激!类似下面这个程序的实现:
请您详细指点下,应该怎么操作?
那些用Delphi实现不了,因为涉及到FileObject,必须用到驱动,以及Native API,Delphi写不了驱动,没法了
甚至你可以用Delphi做界面,VC负责通信
http://blog.csdn.net/sunnysheng/archive/2009/08/17/4456159.aspx
老大果然厉害……
这样的话我也没辙了,直接和驱动通信好像也就能发IRP,不过Delphi的源码我真没见过
function GetProcessPath(PID : Integer): String;
var
hProcess: THandle;
hMod:hModule;
cbNeeded:DWORD;
szProcessName:array[0..1024] of Char;
begin
hProcess:=OpenProcess(PROCESS_QUERY_INFORMATION OR PROCESS_VM_READ,FALSE, PID );
szProcessName := 'unknown';
if (hProcess<>0) then begin
if(EnumProcessModules(hProcess,@hMod,sizeof(hMod),cbNeeded)) then begin
GetModuleFileNameEx(hProcess,hMod,szProcessName,sizeof(szProcessName));
Result := StrPas(szProcessName);
end;
end;
CloseHandle(hProcess);
end;
//------------------------模块获取----------------------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 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
begin
if GetProcessModuleFile(hProcess,arrModules[I])='' then
break;
Strings.Add(GetProcessModuleFile(hProcess,arrModules[I]));
end;
end;
var
OldTokenPrivileges, TokenPrivileges: TTokenPrivileges;
ReturnLength: dword;
hToken: THandle;
Luid: int64;
begin
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken);
LookupPrivilegeValue(nil, 'SeDebugPrivilege', Luid);
TokenPrivileges.Privileges[0].luid := Luid;
TokenPrivileges.PrivilegeCount := 1;
TokenPrivileges.Privileges[0].Attributes := 0;
AdjustTokenPrivileges(hToken, False, TokenPrivileges, SizeOf(TTokenPrivileges), OldTokenPrivileges, ReturnLength);
OldTokenPrivileges.Privileges[0].luid := Luid;
OldTokenPrivileges.PrivilegeCount := 1;
OldTokenPrivileges.Privileges[0].Attributes := TokenPrivileges.Privileges[0].Attributes or SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, False, OldTokenPrivileges, ReturnLength, PTokenPrivileges(nil)^, ReturnLength);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
NewItem: TListItem;
Summ,pid:integer;
url:string;
begin
SetPrivilege;
test1Click(self);
//AdjustProcessPrivilege(GetCurrentProcess,'SeDebugPrivilege');
ListView1.Items.BeginUpdate;
ListView1.Items.Clear;
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
Summ := 0;
while ContinueLoop do
begin
url:='OS Process(系统关键进程)';
Summ := Summ + 1;
NewItem := ListView1.Items.Add; //在ListView1显示
NewItem.ImageIndex := -1;
NewItem.Caption := ExtractFileName(FProcessEntry32.szExeFile); //进程名称
NewItem.subItems.Add(IntToStr(FProcessEntry32.th32ProcessID));//进程ID
//-------------------
pid:=FProcessEntry32.th32ProcessID;
url:=GetProcessPath(pid);
NewItem.subItems.Add(url);//进程全路径
NewItem.subItems.Add(FormatFloat('00', Summ));//序号
NewItem.subItems.Add(IntToStr(FProcessEntry32.cntThreads));//进程ID
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
ListView1.Items.EndUpdate;
zt.Caption:='当前状态:进程数为'+inttostr(listview1.Items.Count);
end;
谢谢!