![]() |
Dateipfad eines Prozess Images für 64 bit Prozesse ermitteln
In folgendem Thread kam die Frage auf, wie man den Prozesspfad eines 64 bit Prozesses ermitteln kann:
![]() Da ![]() ![]() :!: Edit 1: Für Systeme ab Windows Vista wird nun zuerst versucht die ![]() :!: Edit 2: Die native ![]() ![]() :!: Edit 3: Für Systeme unter Windows XP wird nun ![]()
Delphi-Quellcode:
Viele Grüße
function DeviceNameToFilePath(FileName: String): String;
var Buffer: array[0..MAX_PATH - 1] of Char; BufferSize: DWord; LogicalDrives: array of Char; I: Integer; DeviceName: String; begin Result := ''; BufferSize := GetLogicalDriveStrings(MAX_PATH, @Buffer[0]); if (BufferSize = 0) then Exit; SetLength(LogicalDrives, (BufferSize - 2 * SizeOf(Char)) div 3); for I := Low(LogicalDrives) to High(LogicalDrives) do begin LogicalDrives[I] := Buffer[I * 4]; end; for I := Low(LogicalDrives) to High(LogicalDrives) do begin BufferSize := QueryDosDevice(PChar(LogicalDrives[I] + ':'), @Buffer[0], MAX_PATH); if (BufferSize > 0) then begin DeviceName := AnsiLowerCase(PWideChar(@Buffer[0])); if (AnsiLowerCase(Copy(FileName, 1, Length(DeviceName))) = DeviceName) then begin Result := LogicalDrives[I] + ':' + Copy(FileName, Length(DeviceName) + 1, Length(FileName)); Exit; end; end; end; end; function GetProcessPathByHandle(hProcess: THandle): String; var QueryFullProcessImageName: function(hProcess: THandle; dwFlags: DWord; ImageFileName: PWideChar; dwSize: PDWord): BOOL; stdcall; GetProcessImageFileName: function(hProcess: THandle; ImageFileName: PWideChar; dwSize: DWord): DWord; stdcall; GetModuleFileNameEx: function(hProcess: THandle; hModule: HMODULE; FileName: PWideChar; dwSize: DWord): DWord; stdcall; FileName: array[0..MAX_PATH - 1] of WideChar; BufferSize: DWord; begin Result := ''; // Windows Vista or higher @QueryFullProcessImageName := GetProcAddress(LoadLibrary('kernel32.dll'), 'QueryFullProcessImageNameW'); if Assigned(QueryFullProcessImageName) then begin BufferSize := MAX_PATH; if (QueryFullProcessImageName(hProcess, 0, @FileName[0], @BufferSize)) then begin Result := PWideChar(@FileName[0]); Exit; end; end; // Windows XP @GetProcessImageFileName := GetProcAddress(LoadLibrary('kernel32.dll'), 'GetProcessImageFileNameW'); if (not Assigned(GetProcessImageFileName)) then begin @GetProcessImageFileName := GetProcAddress(LoadLibrary('psapi.dll'), 'GetProcessImageFileNameW'); end; if Assigned(GetProcessImageFileName) then begin BufferSize := GetProcessImageFileName(hProcess, @FileName[0], MAX_PATH); if (BufferSize > 0) then begin Result := DeviceNameToFilePath(PWideChar(@FileName[0])); Exit; end; end; // Windows 2000 @GetModuleFileNameEx := GetProcAddress(LoadLibrary('kernel32.dll'), 'GetModuleFileNameExW'); if (not Assigned(GetModuleFileNameEx)) then begin @GetModuleFileNameEx := GetProcAddress(LoadLibrary('psapi.dll'), 'GetModuleFileNameExW'); end; if Assigned(GetModuleFileNameEx) then begin BufferSize := GetModuleFileNameEx(hProcess, 0, @FileName[0], MAX_PATH); if (BufferSize > 0) then begin Result := PWideChar(@FileName[0]); // Bugfix for system and service processes if (Copy(Result, 1, 4) = '\??\') then begin Result := Copy(Result, 5, Length(Result)); end; Exit; end; end; end; function GetProcessPathByPID(PID: DWord): String; var hProcess: THandle; begin Result := ''; hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, PID); if (hProcess <> 0) and (hProcess <> INVALID_HANDLE_VALUE) then try Result := GetProcessPathByHandle(hProcess); finally CloseHandle(hProcess); end; end; Zacherl |
AW: Dateipfad eines Prozess Images für 64 bit Prozesse ermitteln
:arrow: Copy & Paste Bug beim Importieren der APIs gefixt
:arrow: Bugfix für System und Service Prozesse. Bei Prozessen, auf die man nur mit dem SeDebugPrivilege zugreifen kann, wird unter Windows 2000 die Zeichenfolge "\??\" der Rückgabe von GetModuleFileNameEx() vorangestellt. |
AW: Dateipfad eines Prozess Images für 64 bit Prozesse ermitteln
Hallo Zacherl
die Funktion wäre super, nur bring ich sie leider nicht zum funktionieren. Erste kleine Anmerkung: Bei Delphi7 gibt's bei
Delphi-Quellcode:
in der
BufferSize := QueryDosDevice(PChar(LogicalDrives[I] + ':'),
@Buffer[0], MAX_PATH);
Code:
einen Typumwandlungsfehler.
function DeviceNameToFilePath(FileName: String): String;
Lösung: Eine String-Variable (hi) deklarieren und:
Code:
Ich habe zum Testen ein ganz dämliches Programm drum herum gebastelt. Ein Button und ein Edit. ins Edit-Feld gebe ich aus dem Task-Manager eine PID (z.B. von Delphi) ein und mit der rufe ich GetProcessPathByPID auf. Ich bekomme aber immer einen leeren String zurück.
hi := LogicalDrives[I] + ':';
BufferSize := QueryDosDevice(PChar(hi), @Buffer[0], MAX_PATH); Getestet auf XP-Prof. mit Delphi7. Wenn ich das mit dem Debugger durchspiele, holt er sich zwar ein ImageFileName über die PSAPI.DLL. Aber irgendwie verliert er sich în der Umwandlungsroutine DeviceNameToFilePath. Ich kann mir nicht vorstellen, dass es mit meiner oben erwähnten Korrektur zu tun, vermute aber viel mehr irgend ein Delphi-Versionen-Problem |
AW: Dateipfad eines Prozess Images für 64 bit Prozesse ermitteln
Kannst du erkennen, was genau in der Funktion schief geht? Die DeviceNameToFilePath() Funktion ist leider ziemlich dirty, allerdings kenne ich keine bessere Möglichkeit.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz