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