Seite 1 von 1

Dateipfad der .exe eines fremden Prozesses ermitteln

Verfasst: 23.03.2007 02:03
von Thorium
Hallo,
kennt jemand eine Möglichkeit den Dateipfad der .exe eines fremden Prozesses zu ermitteln unter Windows? Und zwar so das es auch unter Windows 2000 funktioniert.

Ich habe die MSDN dazu befragt aber irgendwie nix brauchbares gefunden. Es gibt zwar eine entsprechende API-Funktion: GetProcessImageFileName. Aber die wurde erst mit XP eingeführt.

Man kann ja die Dateipfade der geladenen Module ermitteln per GetModuleFileName. Allerdings funktioniert das ganze nur für den eigenen Prozess. Interessanterweise bekommt man aber eine Module-ID wenn man die Prozesse enummeriert per CreateToolhelp32Snapshot und Process32First/Process32Next. Nur habe ich keine API-Funktion gefunden mit der ich diese Module-ID nutzen könnte. GetModuleFileName verlangt einen Handle, welcher nicht die ID ist, das hab ich schon probiert. Und ich habe keine Funktion gefunden, welche mir per ID einen Handle für das Module liefert.

Edit: Ach ja, GetWindowModuleFileName nützt mir auch nix, da das ganze auch mit Prozessen funktionieren soll, die kein Fenster haben.

Verfasst: 23.03.2007 02:35
von ts-soft
>> Interessanterweise bekommt man aber eine Module-ID wenn man die Prozesse enummeriert per CreateToolhelp32Snapshot und Process32First/Process32Next
Wo ist dann noch das Problem, steht doch alles in der Struktur :wink:

Code: Alles auswählen

; als hWnd nehme ich den von Notepad, welches vorher zu öffnen ist,
; sollte das hWnd des Programmes bekannt sein, ist dies natürlich überflüssig

Define.l handle, res, PID, hWnd = FindWindow_(0, "Unbenannt - Editor")

Define.MODULEENTRY32 Entry
Entry\dwSize = SizeOf(MODULEENTRY32)

If hWnd
  GetWindowThreadProcessId_(hWnd, @PID)
  handle = CreateToolhelp32Snapshot_(#TH32CS_SNAPMODULE, PID)

  If handle
    res = Module32First_(handle, Entry); das erste Modul ist die Exe selber, so das mehr nicht nötig ist!
    If res
       Debug PeekS(@Entry\szExePath)
    EndIf
    CloseHandle_(handle)
  EndIf
EndIf

Verfasst: 23.03.2007 02:50
von Thorium
ts-soft hat geschrieben:

Code: Alles auswählen

; als hWnd nehme ich den von Notepad, welches vorher zu öffnen ist,
; sollte das hWnd des Programmes bekannt sein, ist dies natürlich überflüssig

Define.l handle, res, PID, hWnd = FindWindow_(0, "Unbenannt - Editor")

Define.MODULEENTRY32 Entry
Entry\dwSize = SizeOf(MODULEENTRY32)

If hWnd
  GetWindowThreadProcessId_(hWnd, @PID)
  handle = CreateToolhelp32Snapshot_(#TH32CS_SNAPMODULE, PID)

  If handle
    res = Module32First_(handle, Entry); das erste Modul ist die Exe selber, so das mehr nicht nötig ist!
    If res
       Debug PeekS(@Entry\szExePath)
    EndIf
    CloseHandle_(handle)
  EndIf
EndIf
Ah, super, danke. :allright:

Re: Dateipfad der .exe eines fremden Prozesses ermitteln

Verfasst: 23.03.2007 04:04
von edel
Thorium hat geschrieben: Edit: Ach ja, GetWindowModuleFileName nützt mir auch nix, da das ganze auch mit Prozessen funktionieren soll, die kein Fenster haben.
ts-soft hat geschrieben:

Code: Alles auswählen

; als hWnd nehme ich den von Notepad, welches vorher zu öffnen ist,
; sollte das hWnd des Programmes bekannt sein, ist dies natürlich überflüssig

[...]

Was denn nun ?



Hier mal ohne Fenster :

Code: Alles auswählen

Import "Psapi.lib"
  EnumProcessModules_(Process,hmodule,SizeOf_hmodule,cbNeeded) As "_EnumProcessModules@16"
  GetModuleFileNameEx_(hProcess,hmodule,Buffer,buffer_len) As "_GetModuleFileNameExA@16"
EndImport

Procedure.s GetExePathFromProcessName(name.s)
  Protected hSnapShot , hmod , Process
  Protected processinfo.PROCESSENTRY32
  Protected result , Buffer.s
  
  hSnapShot = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS,0)
  
  If hSnapShot
    
    processinfo\dwSize = SizeOf(PROCESSENTRY32)
    
    result = Process32First_(hSnapShot,processinfo)
    
    While result
      
      If CompareMemoryString(@processinfo\szExeFile,@name) = 0
        
        proc    = OpenProcess_(#PROCESS_QUERY_INFORMATION|#PROCESS_VM_READ,0,processinfo\th32ProcessID)
        
        EnumProcessModules_(proc,@hmod,SizeOf(Long),null)
        
        Buffer  = Space(#MAX_PATH)
        
        GetModuleFileNameEx_(proc,hmod,@Buffer,#MAX_PATH)
        
        CloseHandle_(hSnapShot)
        
        ProcedureReturn Buffer 
      EndIf
      
      processinfo\dwSize = SizeOf(PROCESSENTRY32)
      result = Process32Next_(hSnapShot,processinfo)
    Wend  
    
  EndIf 
  
EndProcedure

Debug GetExePathFromProcessName("explorer.exe")

Re: Dateipfad der .exe eines fremden Prozesses ermitteln

Verfasst: 23.03.2007 11:28
von Thorium
edel hat geschrieben:
Thorium hat geschrieben: Edit: Ach ja, GetWindowModuleFileName nützt mir auch nix, da das ganze auch mit Prozessen funktionieren soll, die kein Fenster haben.
ts-soft hat geschrieben:

Code: Alles auswählen

; als hWnd nehme ich den von Notepad, welches vorher zu öffnen ist,
; sollte das hWnd des Programmes bekannt sein, ist dies natürlich überflüssig

[...]

Was denn nun ?
ts-softs Beispiel funktioniert auch ohne hWnd. Der Fensterhandle wird da ja nur benutzt um die Process-ID zu bekommen. Aber trotzdem auch an dich ein Danke für den Beispielcode. :allright:

Verfasst: 23.03.2007 14:33
von ts-soft
@edel
FindWindow dient in dem Beispiel ja nur um ein hWnd zu bekommen, damit
ich eine PID bekomme :D
Er wollte ja von PID und nicht von Prozeßname, aber egal, jetzt hat er beides :D