查看一个进程所调用的所有文件路径列表!
麻烦各位指点下:如果有一个进程比如qq.exe,我想查看它在运行过程中所涉及到的所有文件以及该文件的路径列表,像下图所示,不仅仅是它程序自己的模块,还包括所有调用的文件。只是显示dll以及exe这个不难做到,关键是所有文件。请各位老大指点小弟,急急急!!!!!!!不胜感激!类似下面这个程序的实现:

解决方案 »

  1.   

    用进程快照,配合mouduleNext遍历模块
      

  2.   

    gyk120 
    请您详细指点下,应该怎么操作?
      

  3.   

    这个一两句话说不清楚,你用CreateToolHelp32SnapShot建立一个快照,然后用Process32Next遍历进程,找到QQ.exe,然后用Module32Next遍历所有的模块,就可以得到模块信息了
      

  4.   

    http://hi.baidu.com/sxshandian/blog/item/81a4c2660c464d23ab184cd5.html
      

  5.   

    这个获取到的只是它模块,其中包括“ dll" "exe",而不是所有的文件。
      

  6.   

    你说的是其他文件啊……
    那些用Delphi实现不了,因为涉及到FileObject,必须用到驱动,以及Native API,Delphi写不了驱动,没法了
      

  7.   

    我有现成的驱动,vc的,而且还有现成的Vc源码,但是不知道delphi能否调用这个驱动?
      

  8.   

    那也不好写,驱动的结构都是按照C的格式在WDK里面定义好的了,Delphi难写……
      

  9.   

    我觉得你可以到VC版问这个问题,让那里的高手帮你解决问题,毕竟C和驱动通信更好一些,只要你们老板不找你要src就行了
    甚至你可以用Delphi做界面,VC负责通信
      

  10.   

    但是毕竟是个delphi程序阿,不知道该怎么弄好!
      

  11.   

    你尝试一下用DeviceIOControl看看能不能通信
    http://blog.csdn.net/sunnysheng/archive/2009/08/17/4456159.aspx
      

  12.   

    DeviceIOControl是绕过驱动和硬件通讯,这里可没有硬件来接受IO请求。
      

  13.   

    这是我的疏忽,抱歉
    老大果然厉害……
    这样的话我也没辙了,直接和驱动通信好像也就能发IRP,不过Delphi的源码我真没见过
      

  14.   


    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;
      

  15.   

    部分系统进程与杀毒软件会获取不到先procedure SetPrivilege;//DEBUG提权
    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;
      

  16.   

    您给的是获取进程模块的函数,这个不难,关键是获取所有的调用文件以及关联,不止是dll和exe!
    谢谢!