Processe auflisten a'la TaskManager

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Processe auflisten a'la TaskManager

Beitrag 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 ?
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Processe auflisten a'la TaskManager

Beitrag von mk-soft »

Für 64bit die falsche Struktur verwendet...

Die richtige ist in Purebasic declariert.

Code: Alles auswählen

Protected ProcessEntry.PROCESSENTRY32
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Processe auflisten a'la TaskManager

Beitrag 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...
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Processe auflisten a'la TaskManager

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Processe auflisten a'la TaskManager

Beitrag 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.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Antworten