Processe auflisten: EnumProcesses() und Co...

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

 

m a j o r

Betreff: Processe auflisten: EnumProcesses() und Co...

BeitragDi, Dez 25, 2007 1:31
Antworten mit Zitat
Benutzer-Profile anzeigen
beschreibung: kleines modul welches eine kleine interaktion mit den windows-prozessen ermöglicht..
funktionen: alle prozesse auflisten(name + prozessid), alle prozesse eines bestimmten namen auflisten, prozesse abschießen

das modul stellt sozusagen die basis-funktionalität bereit, welche man z.b. für einen taskmanager braucht.
exisitiert so etwas schon?

ich habe den modulnamen ind für independent, also unabhängig, gewählt.

die libsapi.a muss ins blitzmax/lib verzeichnis!

Alles zum runterladen hier

Code: [AUSKLAPPEN]


   EnumProcesses:Int[]() 'liefert einen Integer-Array, welcher die PID's aller Prozesse enthält

   GetProcessName:String(pid:Int)

   GetProcessByName:Int[](name$) 'liefert einen Integer-Array, welcher die PID's aller Prozesse mit dem angegebenen namen enthält

   KillProcess:Int(pid:Int)


kleines beispiel:

Code: [AUSKLAPPEN]

Framework brl.standardio
Import ind.process
Strict



Local prozesse:Int[]
Local i:Int
Local name:String



' PROZESSE AUFLISTEN

prozesse=enumprocesses() 'PIDs ermitteln






If prozesse=Null Then RuntimeError("Konnte Prozesse nicht auflisten!")
      
      Print "~r~nEs laufen zur Zeit "+prozesse.length+" Prozesse"
      Print "Liste:"
      Print "~r~n------------------------------~r~n"
      Print "Nummer PID Name"
      Print "~r~n------------------------------~r~n"



For i=0 To prozesse.length-1


   'zu jeder PID den namen ermitteln
   name=getprocessname(prozesse[i])
   
   
   
   If name=Null Then name="<konnte nicht auslesen>"

   Print   "("+i+") "+prozesse[i]+" "+name
   
   
   

Next



Print "~r~n------------------------------~r~n"


Local eingabe:String
Local treffer:Int[]

Print("Geben sie den Namen einer Anwendung ein, z.B. ~qcmd.exe~q")

eingabe=Input("Wahl:")


treffer=getprocessbyname(eingabe) 'int array mit treffern ermitteln

If treffer=Null Then

   Print "Prozess laeuft nicht!"

Else

   Print "Prozess laeuft "+treffer.length+" mal"
   
   Local pids:String
   
   For i=0 To treffer.length-1
   
      pids=pids+","+treffer[i] 'durchgehen und PIDs entnehmen
   
   Next
   
   Print "PID's:"+pids[1..]
   

   Print "~r~nMoechten Sie diese Processe killen?"
   
Repeat   
   eingabe=Input("[J]a / [N]ein: ").tolower()
   
   If eingabe="j" Then
   
      For i=0 To treffer.length-1
   
         Print "Kille Prozess "+treffer[i]   
         If KillProcess(treffer[i]) Then
            Print "ERFOLGREICH!"
            Else
            Print "Fehlgeschlagen"
         End If
   
      Next

      
   
   End If
   
   If eingabe="n" Or eingabe="j" Then Exit   
   
Forever


End If



End




Und hier der CODE für das modul..

Code: [AUSKLAPPEN]

Module IND.PROCESS

ModuleInfo "Version: 1.00"
ModuleInfo "Author: goinginsane@arcor.de / UIN: 465-967-879"


Import "-ladvapi32"
Import "-lpsapi"

Strict



Extern "win32"

   Function OpenProcess(p1:Int,p2:Int,id:Int)
   Function _EnumProcesses(pProcessIds:Byte Ptr,size:Int,byteret:Int Ptr)="EnumProcesses@12"
   Function _TerminateProcess(handle:Int,bla:Int)="TerminateProcess@8"
   Function CloseHandle(handle:Int)
   Function EnumProcessModules(hProcess:Int,lphModule:Byte Ptr,cb:Int,lpcbNeeded:Int Ptr)
   Function GetModuleBaseName(hProcess:Int,bla:Int,lpBaseName:Byte Ptr,nSize:Int)="GetModuleBaseNameA@16"
End Extern

Rem
bbdoc: retrieve all processes that equals the given name
returns: an integer array containing the pid's
End Rem
Function GetProcessByName:Int[](name:String,buffsize:Int=10)
   name=name.tolower()
   Local plist:Int[]
   Local i:Int,j:Int
   Local buffer:Int[buffsize]
   Local ret:Int[]
   

   plist=Enumprocesses()
   
   If plist=Null Then Return Null
   
   For i=0 To plist.length-1
   
   
      If GetProcessName(plist[i]).tolower()=name Then
         buffer[j]=plist[i]
         
         j:+1
         If(j=buffsize) Then Return GetProcessByName(name,buffsize+10)

      End If
   
   
   Next
   
   If j=0 Then Return Null
   
   ret=New Int[j]
   MemCopy(ret,buffer,j*4)
   
   Return ret

End Function

Rem
bbdoc: get the name of a process
returns: name:String
End Rem
Function GetProcessName:String(pid:Int)

   Const MAX_PATH=260
   Local handle:Int
   Local mem:Byte Ptr
   Local need:Int

   handle=OpenProcess(1024|16,0,pid)
   If handle=0 Then Return Null
   
Rem   hmm.. das wollte nüch :(
   Local size:Int=100

   Repeat
   
      size:+100
      
      mem=MemAlloc(size)
   
      If Not EnumProcessModules(handle,mem,size,Varptr need) Then
      
         MemFree(mem)
         CloseHandle(handle)
         Return Null
         
      End If
      
      
   
   Until need<=size
End Rem
   '
   
   Local szProcessName:Byte[]
   szProcessName=New Byte[MAX_PATH]
   
   GetModuleBaseName(handle,0,Varptr szProcessName[0],MAX_PATH)
   
'   MemFree(mem)
   CloseHandle(handle)
   
   Return String.fromCString(szProcessName)

End Function

Rem
bbdoc: terminates the process <pid>
returns: TRUE if successfull
End Rem
Function KillProcess:Int(pid:Int)
   Local handle:Int
   Local success:Int
   handle=OpenProcess(1, 0, pid)
   If handle=0 Then Return 0
   success=_TerminateProcess(handle,-1)
   CloseHandle(handle)
   Return success
End Function

Rem
bbdoc: lists all running processes
returns: an integer array holding the pid's
End Rem
Function EnumProcesses:Int[]()

   Local mem:Byte Ptr
   Local size:Int=100
   Local ret:Int
   Local array:Int[]
   
   Repeat
   
      size:+100
      
      mem=MemAlloc(size)
      
      If Not _EnumProcesses(mem,size,Varptr ret) Then
         MemFree(mem)
         Return Null
      End If

   Until size>ret
   
   array=New Int[ret/4]
   
   MemCopy(Varptr array[0],mem,ret)
   MemFree(mem)
   
   
   Return array
   
End Function






Update:

jetzt ist auch lese- und schreib zugriff auf die einzelnen prozesse möglich..
hierzu wurde das modul processmem erstellt
wenn noch fehler existieren, bitte melden.
wurde zum archiv hinzugefügt, download-link siehe oben!


lese/schreib-beispiel:
Code: [AUSKLAPPEN]

Framework brl.standardio
Import ind.processmem 'importiert ebenfalls ind.process

Strict




Global pid:Int,pids:Int[]

pids=getprocessbyname("memapp.exe")

If pids=Null Then RuntimeError("Prozess läuft nicht!")

pid=pids[0] 'läuft ja nur 1x



Global ADRESSE=ADRESSE_HIER_EINFUEGEN


Global stream:TProcessMemStream=New TProcessMemStream


stream.attach(pid,ADRESSE,1,1) 'parameter size ist optional.. 1 wäre hier sinnvoll.. aber achtung: falls size benutzt

wurde und zu einer anderen adresse gewechselt werden soll muss das per attach() passieren, da es bei seek() sonst zu

problemem kommt...

Print "Teste:"
lesetest()
schreibtest()
lesetest()

'stream.close() überflüssig!
End





Function lesetest()

Local a:Byte

stream.seek(ADRESSE)
a=stream.readbyte()

Print "Ausgelesen:"+a

End Function






Function schreibtest()

stream.seek(ADRESSE)
stream.writebyte(7)

End Function




memapp.bmx
Code: [AUSKLAPPEN]

Framework brl.standardio

Global a:Byte=42

Print "Adresse von a:"+String(Int(Varptr a))

Print "jetzt Addresse kopieren!"

Input("anderes programm starten. dann taste druecken")


Print "Variable a hat den wert:"+a
Input("taste druecken")
End




hier der code für das modul:

Code: [AUSKLAPPEN]

Module ind.processmem

ModuleInfo "Version: 1.00"
ModuleInfo "Author: goinginsane@arcor.de / UIN: 465-967-879"


Import ind.process
Import brl.stream




Strict

Const PROCESS_VM_READ=16
Const PROCESS_VM_WRITE=32
Const PROCESS_VM_OPERATION=8

Extern "win32"

   Function _ReadProcessMemory(hProcess:Int,lpBaseAddress:Int,lpBuffer:Byte

Ptr,nSize:Int,lpNumberOfBytesRead:Int)="ReadProcessMemory@20"
   Function _WriteProcessMemory(hProcess:Int,lpBaseAddress:Int,lpBuffer:Byte

Ptr,nSize:Int,lpNumberOfBytesWritten:Int)="WriteProcessMemory@20"
End Extern


Rem
bbdoc: process memory input/output stream
about: to access the memory of a process create a new TProcessMemoryStream and use .attach()<br>it isn't

necessary to specifie a size<br>The stream can be accessed like a normal tstream<br>when size is given you shouldn't

use seek(); use attach() instead!
End Rem
Type TProcessMemStream Extends TStream 'mal flott kopiert vom ramstream un bissle umgemurkst ;)

   Field _pos,_size,_read,_write
   Field _pid:Int
   

   Method Pos()
      Return _pos
   End Method

   Method Size()
      Return _size
   End Method
   
   Method Eof()
      Return _pos=_size And _size<>0
   End Method

   Method Seek( pos )
      If pos<0 pos=0 Else If pos>_size And _size<>0 pos=_size
      _pos=pos
      Return _pos
   End Method
   
   

   Method Read( buf:Byte Ptr,count )
      If count<=0 Or _read=False Then Throw New TStreamReadException

      If _pos+count>_size And _size<>0 count=_size-_pos
      
      Local buff:Byte[]
      buff=ReadProcessMemory(_pid,_pos,count)
      If Not buff Then Throw New TStreamReadException
      
      MemCopy buf,Varptr buff[0],count
      _pos:+count
      Return count
   End Method

   Method Write( buf:Byte Ptr,count )
      If count<=0 Or _write=False Then Throw New TStreamwriteException
      If _pos+count>_size And _size<>0 Then count=_size-_pos
      
      
      If Not WriteProcessMemory(_pid,_pos,Null,buf,count) Then Throw New

TStreamWriteException

      'MemCopy _buf+_pos,buf,count
      _pos:+count
      Return count
   End Method
Rem
   Function Create:TRamStream( addr:Int ,size,readable,writeable )
      Local stream:TRamStream=New TRamStream
      stream._pos=0
      stream._size=size
      stream._buf=buf
      stream._read=readable
      stream._write=writeable
      Return stream
   End Function
   
End Rem   
   

   Method attach(pid:Int,addr:Int,readable:Int,writeable:Int,size:Int=0)

   

      _pos=addr
      _pid=pid
      _read=readable
      _write=writeable
      If size<>0 Then _size=addr+size
      
   End Method
   
End Type


Rem
bbdoc: process memory read function
about: used by TProcessMemStream
End Rem
Function ReadProcessMemory:Byte[](pid:Int,addr:Int,bytes:Int)

   Local handle:Int
   Local buff:Byte[bytes]
   
   handle=OpenProcess(PROCESS_VM_READ,0,pid)
   
   If handle=Null Then Return Null
   
   If Not _ReadProcessMemory(handle,addr,Varptr buff[0],bytes,0) Then    

CloseHandle(handle);Return Null
   CloseHandle(handle)
   Return buff

End Function


Rem
bbdoc: process memory write function
about: used by TProcessMemStream
End Rem
Function WriteProcessMemory:Int(pid:Int,addr:Int,buff:Byte[],p:Byte Ptr=Null,count:Int=0)

   Local handle:Int


   handle=OpenProcess(PROCESS_VM_WRITE|PROCESS_VM_OPERATION,0,pid)
   
   If handle=Null Then Return 0
   If p Then
   If Not _WriteProcessMemory(handle,addr,p,count,0) Then    CloseHandle(handle);Return 0
   
   Else
   If Not _WriteProcessMemory(handle,addr,Varptr buff[0],buff.length,0) Then    

CloseHandle(handle);Return 0

   End If
   
   CloseHandle(handle)
   Return 1

End Function




das beispiel nochmal ohne stream
Code: [AUSKLAPPEN]

Function lesetest()

Local a:Byte[]

a=ReadProcessMemory(pid,ADRESSE,1)

Print "Ausgelesen:"+a[0]

End Function






Function schreibtest()

Local a:Byte[1]

a[0]=7

WriteProcessMemory(pid,ADRESSE,a)

End Function
  • Zuletzt bearbeitet von m a j o r am Mi, Dez 26, 2007 21:18, insgesamt 3-mal bearbeitet
 

ChristianK

BeitragDi, Dez 25, 2007 2:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicht schlecht. Smile
Kannst du auch noch Lese- und Schreibzugriff auf den Speicher der Prozesse einbauen?
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
 

m a j o r

BeitragMi, Dez 26, 2007 21:13
Antworten mit Zitat
Benutzer-Profile anzeigen
sooo... sollte gehen so? oder hast du dir das anders gedacht?
 

Lion

BeitragSa, März 13, 2010 15:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Tschuldige, dass ich das hier pushe, aber hat zufällig noch wer das archiv von oben? Scheint ja irgendwie down zu sein...
Intel Core 2 Quad 4x2.66 ghz - 4gb ddr2 - nvidia GeForce GTX660 2gb
Intel Atom 1x1.83 ghz - 2gb ddr2 - intel GMA 3150 256mb
AMD A10-5750M 4x2.5 ghz - 8 gb ddr4 - AMD R9 M290x

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group