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