Seite 1 von 1

Processe auflisten a'la TaskManager

Verfasst: 06.02.2013 16:27
von Bisonte
Hallo.

Wie kann ich x32 UND x64 Prozesse mit allen Infos (Structure ProcessEntry32) ermitteln ?
Ich bekomme nur von den x86 Prozessen alle Daten (Iconhandle,Name,Pfad usw)
nur von den x64'ern nichts ausser der PID...
(Im Namen sind z.B. wirre Zeichen)

Ich nutze von Thorium die Prozedur um die Daten zu ermitteln :

Code: Alles auswählen

Structure PROCESSENTRY32s
  dwsize.l
  cntusage.l
  th32ProcessID.l
  th32DefaultHeapID.l
  th32ModuleID.l
  cntThreads.l
  th32ParentProcessID.l
  pcPriClassBase.l
  dwFlags.l
  szExeFile.s{1024}
EndStructure
Structure PLI_ProcessInfo
  Name.s
  Path.s
  PID.i
  ParentID.i
  ThreadsCnt.i
  PriorityClass.i
  Icon.i
  WorkingSetSize.i
EndStructure
;
Procedure   GetProcessList(List Tasks.PLI_ProcessInfo(), Icons = #False)

;###### 
;###### Author : Thorium 
;###### Quelle : http://www.purebasic.fr/german/viewtopic.php?f=11&t=12401
;###### Modifiziert von Array auf LinkList
;######

  ClearList(Tasks())

  Protected ProcessSnapHandle, ModuleSnapHandle, RetVal, i, ProcessID, ExePath, IconHandle, SystemAppIcon
  Protected ProcessEntry.PROCESSENTRY32s
  Protected ModuleEntry.MODULEENTRY32
  Protected ProcessListCnt = 0
  
  ProcessEntry\dwSize = SizeOf(ProcessEntry)
  ModuleEntry\dwSize = SizeOf(ModuleEntry)

  ;laufende Prozesse ermitteln
  
  ExePath = AllocateMemory(1024)
  
  ProcessSnapHandle = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS,0)
  RetVal = Process32First_(ProcessSnapHandle,ProcessEntry)
   
  While RetVal = #True
    ProcessListCnt = ProcessListCnt + 1

    AddElement(Tasks())
    Tasks()\Name = PeekS(@ProcessEntry\szExeFile)
    Tasks()\PID = ProcessEntry\th32ProcessID
    Tasks()\ParentID = ProcessEntry\th32ParentProcessID
    Tasks()\ThreadsCnt = ProcessEntry\cntThreads
    Tasks()\PriorityClass = ProcessEntry\pcPriClassBase
    ;Tasks()\WorkingSetSize = GetMemoryUsage(Tasks()\PID)
    Debug Tasks()\Name
    If ProcessEntry\th32ProcessID <> 0
      ModuleSnapHandle = CreateToolhelp32Snapshot_(#TH32CS_SNAPMODULE,ProcessEntry\th32ProcessID)
      If ModuleSnapHandle
        If Module32First_(ModuleSnapHandle,ModuleEntry)
          Tasks()\Path = GetPathPart(Trim(PeekS(@ModuleEntry\szExePath)))
        EndIf
        CloseHandle_(ModuleSnapHandle)
      EndIf
    EndIf
    
    If Icons
      PokeS(ExePath,Tasks()\Path + Tasks()\Name)
      IconHandle = ExtractIcon_(0,ExePath,0)
      If IconHandle = 0
        IconHandle = SystemAppIcon
      EndIf
      Tasks()\Icon = IconHandle
    EndIf
    
    RetVal = Process32Next_(ProcessSnapHandle,ProcessEntry)
    
  Wend
  
  CloseHandle_(ProcessSnapHandle)
  FreeMemory(ExePath)
  
  ProcedureReturn ListSize(Tasks())
  
EndProcedure
Weiss jemand Rat ?

Re: Processe auflisten a'la TaskManager

Verfasst: 08.02.2013 17:43
von mk-soft
Für 64bit die falsche Struktur verwendet...

Die richtige ist in Purebasic declariert.

Code: Alles auswählen

Protected ProcessEntry.PROCESSENTRY32

Re: Processe auflisten a'la TaskManager

Verfasst: 08.02.2013 20:13
von Bisonte
mk-soft hat geschrieben:Für 64bit die falsche Struktur verwendet...

Die richtige ist in Purebasic declariert.

Code: Alles auswählen

Protected ProcessEntry.PROCESSENTRY32
Nunja... es ist nur so, wenn ich diese Struktur nutze, bekomme ich zwar einen lesbaren Namen, aber alles andere ist nur
Datenmüll. Also irgendwas ist da noch verkehrt...

Ich versuche sowas wie J.Baker (http://purebasic.fr/english/viewtopic.php?f=27&t=53285) nur halt für Windows.
Unter 32Bit ist alles kein Problem, nur 64Bit Prozesse krieg ich nicht gemessen...

Re: Processe auflisten a'la TaskManager

Verfasst: 09.02.2013 03:04
von ts-soft
Die in PB vordefinierte Strukture ist korrekt und funktioniert unter x86 und x64 im ASCII oder Unicode Modus.

Mit einem 32-Bit Process kann man selbstverständlich keine Icons einer 64-Bit Exe extrahieren, genauso wenig
wie irgendwelche 64-Bit DLLs laden, das benötigt dann einen 64-Bit Process, der wiederum ... ...

Gruß
Thomas

Re: Processe auflisten a'la TaskManager

Verfasst: 09.02.2013 12:12
von Bisonte
Nunja... ich will mit einer 32bit exe ein 32bit programm "überwachen", und mit einer 64bit exe ein 64bit Programm !

Ersteres funktioniert auch tadellos, nur die 64Bit Geschichte nicht. (das das mit den dll bitmix usw nicht funzt ist mir klar)

Edit : Hab den "Fehler" gefunden und es ist alles Windoofs Schuld ;)

Unter 32Bit kann man sozusagen den Taskmanager ganz normal nachbauen, unter 64Bit braucht man Admin Rechte....
(uh man da haett ich auch vorher drauf kommen können....)

Danke an alle Beteiligten.