加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – GetModuleFileNameEx()没有得到各种系统进程的路径

发布时间:2020-12-15 10:04:05 所属栏目:大数据 来源:网络整理
导读:我创建了这个函数来获取各种网络进程的路径,比如svchost,Firefox等.这是代码: function GetProcessPath(var pId:Integer):String;var Handle: THandle;begin Result := ''; try Handle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,False,
我创建了这个函数来获取各种网络进程的路径,比如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,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;

我的问题是我没有得到所有进程的路径.它适用于获取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,TokenPriv,SizeOf(PrevTokenPriv),PrevTokenPriv,ReturnLength);
      end;
    finally
      CloseHandle(hToken);
    end;
  end;
end;

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读