Delphi 无法通过GetModuleFileNameEx()获取各种系统进程的路径

Delphi 无法通过GetModuleFileNameEx()获取各种系统进程的路径,delphi,Delphi,我创建此函数是为了获取各种网络进程的路径,如svchost、Firefox等。下面是代码: function GetProcessPath(var pId:Integer):String; var Handle: THandle; begin Result := ''; try Handle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, pID);

我创建此函数是为了获取各种网络进程的路径,如svchost、Firefox等。下面是代码:

function GetProcessPath(var pId:Integer):String;
var
    Handle: THandle;

begin
    Result := '';
    try
        Handle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, pID);
        if Handle <> 0 then
        begin
            try
               SetLength(Result, MAX_PATH);
               if GetModuleFileNameEx(Handle, 0, PChar(Result), MAX_PATH) > 0 then
                   SetLength(Result, StrLen(PChar(Result)))
               else
                  Result := '';
            finally
                CloseHandle(Handle);
        end;
    end;

    except
       on E:Exception do
           ShowMessage(E.ClassName + ':' + E.Message);
    end;
end;
函数GetProcessPath(var-pId:Integer):字符串; 变量 手柄:坦德尔; 开始 结果:=''; 尝试 Handle:=OpenProcess(进程\查询\信息或进程\虚拟机\读取,False,pID); 如果句柄为0,则 开始 尝试 设置长度(结果,最大路径); 如果GetModuleFileNameEx(句柄,0,PChar(结果),最大路径)>0,那么 SetLength(结果,StrLen(PChar(结果))) 其他的 结果:=''; 最后 关闭手柄(手柄); 结束; 结束; 除了 关于E:Exception-do ShowMessage(E.ClassName+':'+E.Message); 结束; 结束; 我的问题是,我没有得到所有进程的路径。它可以很好地获取Firefox的路径,以及其他类似的用户级进程。但是对于像alg、Svchost这样的进程,我无法通过这种方法获得路径。我猜我必须使用一些不同的API。我如何解决这个问题


我正在使用Windows XP,32位。

您需要设置调试权限。这是如何做到的:

function NTSetPrivilege(sPrivilege: string; bEnabled: Boolean): Boolean;
var
  hToken: THandle;
  TokenPriv: TOKEN_PRIVILEGES;
  PrevTokenPriv: TOKEN_PRIVILEGES;
  ReturnLength: Cardinal;
begin
  Result := True;

  // Only for Windows NT/2000/XP and later.
  if not (Win32Platform = VER_PLATFORM_WIN32_NT) then Exit;

  Result := False;

  // Obtain the processes token
  if OpenProcessToken(GetCurrentProcess(),
    TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
  begin
    try
      // Get the locally unique identifier (LUID) .
      if LookupPrivilegeValue(nil, PChar(sPrivilege),
        TokenPriv.Privileges[0].Luid) then
      begin
        TokenPriv.PrivilegeCount := 1; // One privilege to set

        case bEnabled of
          True: TokenPriv.Privileges[0].Attributes  := SE_PRIVILEGE_ENABLED;
          False: TokenPriv.Privileges[0].Attributes := 0;
        end;

        ReturnLength := 0; // Replaces a var parameter
        PrevTokenPriv := TokenPriv;

        // Enable or disable the privilege

        AdjustTokenPrivileges(hToken, False, TokenPriv, SizeOf(PrevTokenPriv),
          PrevTokenPriv, ReturnLength);
      end;
    finally
      CloseHandle(hToken);
    end;
  end;
end;

NtSetPrivilege('SeDebugPrivilege', TRUE); // Call this on form create

+1@塞浦路斯如果您计划支持Vista或更高版本,请注意UAC问题。