Delphi 无法通过GetModuleFileNameEx()获取各种系统进程的路径
我创建此函数是为了获取各种网络进程的路径,如svchost、Firefox等。下面是代码: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);
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问题。