Dateipfad der .exe eines fremden Prozesses ermitteln

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Dateipfad der .exe eines fremden Prozesses ermitteln

Beitrag 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.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag 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:
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Dateipfad der .exe eines fremden Prozesses ermitteln

Beitrag 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")
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Dateipfad der .exe eines fremden Prozesses ermitteln

Beitrag 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:
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten