function DevicePathToWin32Path(path:string):string;
var c:char;
s:string;
i:integer;
begin
i:=posex('\', path, 2);
i:=posex('\', path, i+1);
result:=copy(path, i, length(path));
delete(path, i, length(path));
for c:='A' to 'Z' do
begin
setlength(s, 1000);
if querydosdevice(pchar(string(c)+':'), pchar(s), 1000)<>0 then
begin
s:=pchar(s);
if sametext(path, s) then
begin
result:=c+':'+result;
exit;
end;
end;
end;
result:='';
end;
function GetProcessFilePath(pid:cardinal):string;
var
hp: THandle;
Buffer1: array[0..MAX_PATH] of Char;
begin
Result := '';
if pid > 0 then
begin
hp := OpenProcess(PROCESS_ALL_ACCESS,False,pid);
if hp > 0 then
begin
if IsWinNT4 or IsWin2K then
begin
if GetModuleFileNameEx(hp,0,Buffer1,Length(Buffer1)) > 0 then
Result := PathGetLongName(
StringReplace(
ExtractFilePath( Buffer1 ),
'\??\', '', [rfReplaceAll, rfIgnoreCase]
)
);
end else
begin
GetProcessImageFileName(hp, Buffer1, Length(Buffer1));
Result := PathGetLongName(
StringReplace(
ExtractFilePath(
DevicePathToWin32Path(Buffer1)
),
'\??\', '', [rfReplaceAll, rfIgnoreCase]
)
);
end;
CloseHandle(hp);
end;
end;
end;