Seite 1 von 1

prozesspfade ermitteln?

Verfasst: 22.01.2006 18:11
von redboy
Hallo

ich würde das gerne so erweitern das auch die pfade zu den dateien angezeigt werden. gibt es da eine möglichkeit ohne alle laufwerke zu durchsuchen?

kann mir jemand helfen oder einen tipp geben... das beispiel ist nicht von mir, aber dafür übersichtlich...

Code: Alles auswählen

#TH32CS_SNAPHEAPLIST = $1
#TH32CS_SNAPPROCESS = $2
#TH32CS_SNAPTHREAD = $4
#TH32CS_SNAPMODULE = $8
#TH32CS_SNAPALL = #TH32CS_SNAPHEAPLIST | #TH32CS_SNAPPROCESS | #TH32CS_SNAPTHREAD | #TH32CS_SNAPMODULE
#TH32CS_INHERIT = $80000000
#INVALID_HANDLE_VALUE = -1
#PROCESS32LIB = 9999

Structure PROCESSENTRY32
   dwSize.l
   cntUsage.l
   th32ProcessID.l
   th32DefaultHeapID.l
   th32ModuleID.l
   cntThreads.l
   th32ParentProcessID.l
   pcPriClassBase.l
   dwFlags.l
   szExeFile.b [#MAX_PATH]
EndStructure

NewList Process32.PROCESSENTRY32()

If OpenLibrary(#PROCESS32LIB,"kernel32.dll")

    snap = CallFunction(#PROCESS32LIB,"CreateToolhelp32Snapshot",#TH32CS_SNAPPROCESS,0)
    If snap
        DefType.PROCESSENTRY32 Proc32
        Proc32\dwSize = SizeOf(PROCESSENTRY32)
        
        If CallFunction(#PROCESS32LIB,"Process32First",snap,@Proc32)
            AddElement(Process32())
            CopyMemory(@Proc32,@Process32(),SizeOf(PROCESSENTRY32))
            
            While CallFunction(#PROCESS32LIB,"Process32Next",snap,@Proc32)
                AddElement(Process32())
                CopyMemory(@Proc32,@Process32(),SizeOf(PROCESSENTRY32))
            Wend
        EndIf
        CloseHandle_(snap)
    EndIf
    CloseLibrary(#PROCESS32LIB)
EndIf

ResetList(Process32())

While NextElement(Process32())
   Debug PeekS(@Process32()\szExeFile) +" : "+Str(PeekL(@Process32()\th32ProcessID))
Wend

Verfasst: 22.01.2006 19:22
von NicTheQuick
Hol dir die PBOSL von http://pbosl.purearea.net und benutz die
Prozess-Lib. Funktioniert wunderbar.

Verfasst: 22.01.2006 20:28
von redboy
hatte mir die hilfe der lib auch schon angeschaut, stand aber nichts vom pfad drin. aber wenn du sagst der pfad ist dabei, dann glaube ich dir das :-)

danke für den tipp...

Verfasst: 03.02.2006 19:24
von Programie
Das sind nur die Dateinamen (z.B. PureBasic.exe)
Wie bekommt man den Pfad raus? :shock:

Verfasst: 03.02.2006 20:13
von Macros
GetProcessDLLFileName(PID)

Hier ein TaskmanagerCode (Nur mit PBOSL):

Code: Alles auswählen

; Process library examples 
; 
; (C) 2004 by Siegfried Rings 
; 
;Following Commands are not implemented in this Testapp , but Fully in the Library: 
;pPokeB(PID,Offset,Value) 
;pPeekw(PID,Offset) 
;pPokew(PID,Offset,Value) 
;pPeekL(PID,Offset) 
;pPokeL(PID,Offset,Value) 
;pReadMemory(handle,addr, DestinationMemoryID, Length) 
;pWriteMemory(handle,addr, SourceMemoryID, Length) 

Enumeration 
  #MainWindow 
  #MainPanel 
  #DeviceDriver 
  #Processes 
  #Process_Info 
  #KillButton 
  #KillButtonAll 
  #Button_Refresh 
  #ButtonSetPrio 
  #ButtonRemovePagefaults 
  #ButtonDump2Screen 
  #MenuPriority 
  #MenuReal 
  #MenuHigh 
  #MenuNormal 
  #MenuLow 
  #MenuWatch 
  #MenuDump2Screen 
  #MenuDump2File 
  #MenuSearchString 
EndEnumeration 

Procedure Open_MainWindow() 
  hwnd=OpenWindow(#MainWindow, 200, 100, 800, 800,  #PB_Window_SystemMenu | #PB_Window_TitleBar , "PB System Info") 
  If hwnd 
    If CreateGadgetList(WindowID()) 
      PanelGadget(#MainPanel, 0, 0, 800, 800) 
      AddGadgetItem(#MainPanel, -1, "General") 
      AddGadgetItem(#MainPanel, -1, "Processes") 
      ListViewGadget(#Processes, 8, 8, 210, 720) 
      TreeGadget(#Process_Info, 218, 8, 560, 720) 
      ButtonGadget(#Button_Refresh, 0, 738, 80, 20, "Refresh List") 
      ButtonGadget(#KillButton, 80, 738, 80, 20, "Kill Process") 
      ButtonGadget(#KillButtonAll, 160, 738, 80, 20, "Kill All") 
      ButtonGadget(#ButtonSetPrio, 240, 738, 80, 20, "Set new Priority") 
      ButtonGadget(#ButtonRemovePagefaults, 320, 738, 80, 20, "Del Pagefaults") 
      ButtonGadget(#ButtonDump2Screen,400, 738, 80, 20, "Dump Hex") 
      DisableGadget(#ButtonDump2Screen,1) 
      AddGadgetItem(#MainPanel, -1, "DeviceDriver") 
      TreeGadget(#DeviceDriver, 8, 8, 460, 310) 
      ;CloseGadgetList() 

     If CreatePopupMenu(#MenuPriority)      
        MenuItem(#MenuReal, "Real") 
        MenuItem(#MenuHigh, "High") 
        MenuItem(#MenuNormal, "Normal") 
        MenuItem(#MenuLow, "Low") 
     EndIf 
     If CreatePopupMenu(#MenuWatch)    
        MenuItem(#MenuDump2Screen, "Dump to Screen") 
        MenuItem(#MenuDump2File, "Dump to File") 
        MenuItem(#MenuSearchString, "Search for String") 
     EndIf 
      

    EndIf 
  EndIf 
  ProcedureReturn hwnd  
EndProcedure 


;From Froggerprogger 
Procedure GetValueFromHEXString(str.s)  
  If Len(str) = 0  
    ProcedureReturn -1  
  EndIf  
    
  str = UCase(str)  
    
  Protected actCharAsc.l, result.l  
  Protected strLen.l      : strLen = Len(str)  
  Protected parseAct.l    : parseAct = @str + strLen - 1  
  Protected parseEnd.l    : parseEnd = parseStart - 7  
  Protected posFact.l     : posFact = 1  
  Protected radix.l       : radix = 16  
      
  actCharAsc = PeekB(parseAct)&$FF  
    
  While ((actCharAsc >= 48 And actCharAsc <= 57) Or (actCharAsc >= 65 And actCharAsc <= 70)) And parseAct >= parseEnd  
    If actCharAsc >= 65  
      actCharAsc - 7  
    EndIf  
    actCharAsc - 48 ; so '0'-'F' has values 0 - 15  
    result + posFact * actCharAsc  
    parseAct - 1  
    posFact * 16  
    actCharAsc = PeekB(parseAct)&$FF  
  Wend  
    
  ProcedureReturn result  
EndProcedure  

Procedure UpdateProcessList() 
 ClearGadgetItemList(#Processes) 
 ProcessCount=ExamineProcesses() 
 For I=1 To ProcessCount 
  NextProcess() 
  AddGadgetItem(#Processes, -1, GetProcessName()) 
 Next I 
EndProcedure 

Procedure Detaillist(PID) 
 ClearGadgetItemList(#Process_Info) 
 AddGadgetItem(#Process_Info, -1, "PID=" + Str(PID)) 
 Prio=GetProcessPrio(PID) 
 Select Prio 
 Case #NORMAL_PRIORITY_CLASS 
  PR.s= "NORMAL" 
 Case #HIGH_PRIORITY_CLASS 
  PR.s= "High" 
 Case #IDLE_PRIORITY_CLASS 
  PR.s= "Idle" 
 Case #REALTIME_PRIORITY_CLASS 
  PR.s= "REALTIME" 
 EndSelect 
 AddGadgetItem(#Process_Info, -1, "Priority=" + PR.s) 
 AddGadgetItem(#Process_Info, -1, "Location=" + GetProcessFileName(PID)) 
  
 a.s="Memory used=" + Str(GetProcessMem(PID)/1024)+" kb" 
 a.s=a.s + "  (Max. " + Str(GetProcessPeakWorkingSetSize(PID)/1024)+" kb)"    
 AddGadgetItem(#Process_Info, -1, a.s ) 

 a.s="Memory Pagefile used=" + Str(GetProcessPagefileUsage(PID)/1024)+" kb" 
 a.s=a.s + "  (Max. " + Str(GetProcessPeakPagefileUsage(PID)/1024)+" kb)"    
 AddGadgetItem(#Process_Info, -1, a.s ) 

 a.s="Pagefaults=" + Str(GetProcessPageFaultCount(PID)) 
 AddGadgetItem(#Process_Info, -1, a.s ) 

 a.s="QuotaPagedPool=" + Str(GetProcessQuotaPagedPoolUsage(PID)) 
 a.s=a.s + "  (Max. " + Str(GetProcessQuotaPeakPagedPoolUsage(PID)) +")"    
 AddGadgetItem(#Process_Info, -1, a.s ) 

 a.s="QuotaNonPagedPool=" + Str(GetProcessQuotaNonPagedPoolUsage(PID)) 
 a.s=a.s + "  (Max. " + Str(GetProcessQuotaPeakNonPagedPoolUsage(PID)) +")"    
 AddGadgetItem(#Process_Info, -1, a.s ) 

  
 dlls= ExamineProcessDLLS(PID) 
 AddGadgetItem(#Process_Info, -1, "DLL's in use ("+Str(dlls) +")") 
 OpenTreeGadgetNode(#Process_Info) 
  For T=1 To dlls 
   NextProcessDLL() 
   name.s=GetProcessDLLName(PID) 
   AddGadgetItem(#Process_Info, -1, name.s) 
   OpenTreeGadgetNode(#Process_Info) 
    AddGadgetItem(#Process_Info, -1, "Memorybase= $" + Hex(GetProcessDLLBase(PID)) ) 
    AddGadgetItem(#Process_Info, -1, "Location=" + GetProcessDLLFileName(PID)) 
   CloseTreeGadgetNode(#Process_Info) 
  Next T 
 CloseTreeGadgetNode(#Process_Info) 
EndProcedure 



Procedure UpdateDeviceList() 
ClearGadgetItemList(#DeviceDriver) 
DevicesCount=ExamineDrivers() 
For I=1 To DevicesCount 
 NextDriver() 
 AddGadgetItem(#DeviceDriver, -1, GetDriverName()) 
 OpenTreeGadgetNode(#DeviceDriver) 
 AddGadgetItem(#DeviceDriver, -1, "Base= $" + Hex(GetDriverBase())) 
 AddGadgetItem(#DeviceDriver, -1, "Location=" + GetDriverFileName()) 
 CloseTreeGadgetNode(#DeviceDriver) 

Next I 
EndProcedure 

hwnd=Open_MainWindow() 
UpdateProcessList() 
UpdateDeviceList() 
PID=GetProcessPIDfromHWND(hwnd) 
MyP.s=GetProcessName(PID) 
If Trim(MyP)<>"" 
 For I= 0 To CountGadgetItems(#Processes) -1 
  SetGadgetState(#Processes,I) 
  Pname0.s=GetGadgetText(#Processes) 
  If LCase(Pname0.s)=LCase(MyP.s) 
   Break 
  EndIf  
 Next 
EndIf 
SetGadgetState(#MainPanel,1) 
Detaillist(PID) 

Repeat 
  Event = WaitWindowEvent() 
  If Event=#PB_EventMenu 
   Select EventMenuID() 
    Case #MenuReal 
     PID=GetProcessPID(GetGadgetText(#Processes)) 
     SetProcessPrio(PID,#REALTIME_PRIORITY_CLASS) 
     Detaillist(PID) 
    Case #MenuHigh 
     PID=GetProcessPID(GetGadgetText(#Processes)) 
     SetProcessPrio(PID,#HIGH_PRIORITY_CLASS) 
     Detaillist(PID) 
    Case #MenuNormal 
     PID=GetProcessPID(GetGadgetText(#Processes)) 
     SetProcessPrio(PID,#NORMAL_PRIORITY_CLASS) 
     Detaillist(PID) 
    Case #MenuLow 
     PID=GetProcessPID(GetGadgetText(#Processes)) 
     SetProcessPrio(PID,#IDLE_PRIORITY_CLASS) 
     Detaillist(PID) 
    
    Case #MenuDump2Screen 
     Gosub Dump2Screen 
    Case #MenuDump2File 

    Case #MenuSearchString 

   EndSelect 
    
  EndIf 
  If Event = #PB_EventGadget 
    
    GadgetID = EventGadgetID() 
    Select GadgetID 
     Case #MainPanel 
      ;Debug "GadgetID: #MainPanel" 
     Case #Processes 
      pName2.s=GetGadgetText(#Processes) 
      PID=GetProcessPID(pName2.s) 
      DisableGadget(#ButtonDump2Screen,1) 
      Detaillist(PID) 
     Case #Process_Info 
      evt=EventType() 
      If evt=#PB_EventType_LeftClick        
       Entry.s=GetGadgetText(#Process_Info) 
       If Right(LCase(Entry.s),4)=".dll" Or Right(LCase(Entry.s),4)=".exe" 
        z1=GetGadgetState(#Process_Info) 
        z1+1:SetGadgetState(#Process_Info,z1) 
        Modulebase.s=GetGadgetText(#Process_Info) 
        z1+1:SetGadgetState(#Process_Info,z1) 
        FullFilename.s=GetGadgetText(#Process_Info) 
        I=FindString(FullFilename.s,"=",1) 
        If I>0 
         FullFilename=Right(FullFilename,Len(FullFilename)-I) 
        EndIf 
        I=FindString(Modulebase.s,"$",1) 
        If I>0 
         Modulebase=Trim(Right(Modulebase,Len(Modulebase)-I)) 
        EndIf 
        pName2.s=GetGadgetText(#Processes) 
        gPID=GetProcessPID(pName2.s) 
        z1-2:SetGadgetState(#Process_Info,z1) 
        DisableGadget(#ButtonDump2Screen,0) 
       Else 
        DisableGadget(#ButtonDump2Screen,1) 
       EndIf 
      EndIf 
      If evt=#PB_EventType_RightClick        
       Entry.s=GetGadgetText(#Process_Info) 
       If Right(LCase(Entry.s),4)=".dll" Or Right(LCase(Entry.s),4)=".exe" 
        z1=GetGadgetState(#Process_Info) 
        z1+1:SetGadgetState(#Process_Info,z1) 
        Modulebase.s=GetGadgetText(#Process_Info) 
        z1+1:SetGadgetState(#Process_Info,z1) 
        FullFilename.s=GetGadgetText(#Process_Info) 
        I=FindString(FullFilename.s,"=",1) 
        If I>0 
         FullFilename=Right(FullFilename,Len(FullFilename)-I) 
        EndIf 
        I=FindString(Modulebase.s,"$",1) 
        If I>0 
         Modulebase=Trim(Right(Modulebase,Len(Modulebase)-I)) 
        EndIf 
        pName2.s=GetGadgetText(#Processes) 
        gPID=GetProcessPID(pName2.s) 
;        Debug entry 
;        Debug ModuleBase 
;        Debug Fullfilename 
        z1-2:SetGadgetState(#Process_Info,z1) 
        GetCursorPos_(L1.Point) 
        DisplayPopupMenu(#MenuWatch, WindowID() ,L1\x, L1\y) 
       EndIf 
      EndIf 
      
     Case #DeviceDriver 
      ;Debug "GadgetID: #DeviceDriver" 
     Case #Process_Info 
      ;Debug "GadgetID: #Process_Info" 
     Case #ButtonDump2Screen 
      Gosub Dump2Screen 
     Case #KillButton 
      PID=GetProcessPID(GetGadgetText(#Processes)) 
      KillPID(PID,0) 
      UpdateProcessList() 
      ClearGadgetItemList(#Process_Info) 
    
     Case #KillButtonall 
      KillAllProcess(GetGadgetText(#Processes),0) 
      DisableGadget(#ButtonDump2Screen,1) 
      UpdateProcessList() 
      ClearGadgetItemList(#Process_Info) 
      
     Case #ButtonRemovePagefaults 
      PID=GetProcessPID(GetGadgetText(#Processes)) 
      result=RemovePagefaults(PID); 
      Debug result 
      DisableGadget(#ButtonDump2Screen,1) 
      Detaillist(PID) 
      
     Case #Button_Refresh 
      DisableGadget(#ButtonDump2Screen,1) 
      UpdateProcessList() 
      ClearGadgetItemList(#Process_Info) 
     Case #ButtonSetPrio 
      GetCursorPos_(L1.Point) 
      DisplayPopupMenu(#MenuPriority, WindowID() ,L1\x, L1\y) 
        
    EndSelect 
  EndIf 
Until Event = #PB_EventCloseWindow 
End 

Dump2Screen: 
;If GetProcessRights(gpid) 

     Offset=GetValueFromHEXString(Modulebase.s) 
     ;Debug Offset 
     Nop.s="$"+RSet(Hex(0), 4, "0") +"    " 
     For I=0 To 511 
      wert.b= pPeekB(gPID,Offset+I) 
     ; Debug wert 
     ; Debug Hex(wert) 
      Nop.s=Nop.s + Right("00"+Hex(wert.b),2) 
      If wert.b>30 
       Nop2.s=Nop2.s+Chr(wert.b) 
      Else 
       Nop2.s=Nop2.s+" " 
      EndIf 
      T=T+1 
      If T=16 
       Nop.s=Nop.s+Space(4)+Nop2.s+Chr(13)+Chr(10) +"$"+RSet(Hex(I), 4, "0") + "    " 
       T=0 
       Nop2.s="" 
      EndIf 
     Next I  
     MessageRequester("Info for "+FullFilename.s+" at $"+Modulebase.s,Nop.s,0) 
;Else 
; MessageRequester("Info for "+Fullfilename.s+" at $"+Modulebase.s,"Sorry, no rights to acess this process!",0) 
;EndIf 
Return