Windows Threads auslesen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

Windows Threads auslesen

Beitrag von Imhotheb »

Hallo Zusammen,

ich versuche gerade alle Threads des Systems auszulesen ... leider klappt das nicht wie vorgesehen.
GetLastError_() liefert nach Thread32_First_() FehlerCode 18 ... aus MSDN: Code 18 (0x12) = There are no more files.
Hat jemand einen Rat oder eine Idee?

Windows 10 64Bit, PB 5.40 32/64, Unicode Exe. an, Administratormodus an/aus (keinen Unterschied)

Code: Alles auswählen

EnableExplicit

Define Snapshot
Define ThE32.THREADENTRY32
Define PE32.PROCESSENTRY32


; Funktioniert
PE32\dwSize = SizeOf(PE32)
Snapshot = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS, 0)
If Snapshot
  If Process32First_(Snapshot, @PE32)
    Repeat                
      Debug "==========="
      Debug "Name: " + PeekS(@PE32\szExeFile)
      Debug "PID: " + Str(PE32\th32ProcessID)
      Debug "Parent PID:: " + Str(PE32\th32ParentProcessID)
      Debug "ThreadCount: " + Str(PE32\cntThreads)
      Debug "----------"
    Until Process32Next_(Snapshot, @PE32) = #False      
  EndIf        
  CloseHandle_(Snapshot)
EndIf 


Debug "/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/"


; funtktioniert NICHT
ThE32\dwSize = SizeOf(ThE32)
Snapshot = CreateToolhelp32Snapshot_(#TH32CS_SNAPTHREAD, 0)
If Snapshot
  If Thread32First_(Snapshot, @ThE32)
    Repeat
      Debug "==========="
      Debug "PID: " + Str(ThE32\th32OwnerProcessID)
      Debug "TID: " + Str(ThE32\th32ThreadID)
      Debug "----------"
    Until Thread32Next_(Snapshot, @ThE32)
  EndIf      
  CloseHandle_(Snapshot)
EndIf




; Hier noch ein Ausschnitt von einem Beispielcode aus MSDN
; ========================================================
;
; BOOL ListProcessThreads( DWORD dwOwnerPID ) 
; { 
;   HANDLE hThreadSnap = INVALID_HANDLE_VALUE; 
;   THREADENTRY32 te32; 
;  
;   // Take a snapshot of all running threads  
;   hThreadSnap = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 ); 
;   If( hThreadSnap == INVALID_HANDLE_VALUE ) 
;     Return( FALSE ); 
;  
;   // Fill in the size of the Structure before using it. 
;   te32.dwSize = SizeOf(THREADENTRY32 ); 
;  
;   // Retrieve information about the first thread,
;   // And exit If unsuccessful
;   If( !Thread32First( hThreadSnap, &te32 ) ) 
;   {
;     printError( TEXT("Thread32First") );  // Show cause of failure
;     CloseHandle( hThreadSnap );     // Must clean up the snapshot object!
;     Return( FALSE );
;   }
; 
;   // Now walk the thread List of the system,
;   // And display information about each thread
;   // associated With the specified process
;   do 
;   { 
;     If( te32.th32OwnerProcessID == dwOwnerPID )
;     {
;       _tprintf( TEXT("\n     THREAD ID      = 0x%08X"), te32.th32ThreadID ); 
;       _tprintf( TEXT("\n     base priority  = %d"), te32.tpBasePri ); 
;       _tprintf( TEXT("\n     delta priority = %d"), te32.tpDeltaPri ); 
;     }
;   } While( Thread32Next(hThreadSnap, &te32 ) );
; 
;   _tprintf( TEXT("\n"));
; 
; //  Don't forget to clean up the snapshot object.
;   CloseHandle( hThreadSnap );
;   Return( TRUE );
; }
PS: ohne Unicode funktioniert auch das erste Beispiel nicht, was aber im Moment keine Rolle spielen sollte
weil einfach einfach einfach ist ... mach' ich es anders
- chris -
Beiträge: 195
Registriert: 24.08.2005 19:52
Wohnort: Stadtallendorf

Re: Windows Threads auslesen

Beitrag von - chris - »

Until Thread32Next_(Snapshot, @ThE32)

Da fehlt das #False
PB v5.72 x86/x64
Windows 10 Pro 64bit
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

Re: Windows Threads auslesen

Beitrag von Imhotheb »

Ohhh man .... :lamer: ... Manchmal sitzt man einfach auf der Leitung. ... Danke für den Korkenzieher :coderselixir:
weil einfach einfach einfach ist ... mach' ich es anders
- chris -
Beiträge: 195
Registriert: 24.08.2005 19:52
Wohnort: Stadtallendorf

Re: Windows Threads auslesen

Beitrag von - chris - »

Code: Alles auswählen


; https://msdn.microsoft.com/en-us/library/windows/desktop/ms686832%28v=vs.85%29.aspx

EnableExplicit

Global Kernel32_hDLL.i

Prototype.i CloseHandle(hObject.i)
Prototype.i CreateToolhelp32Snapshot(dwFlags.l, th32ProcessID.l)
Prototype.i Process32First(hSnapshot.i, *lppe)
Prototype.i Process32Next(hSnapshot.i, *lppe)
Prototype.i Thread32First(hSnapshot.i, *lpte)
Prototype.i Thread32Next(hSnapshot.i, *lpte)

Procedure Kernel32_CloseDLL()
  If Kernel32_hDLL <> 0
    If IsLibrary(Kernel32_hDLL)
      CloseLibrary(Kernel32_hDLL)
    EndIf
    Kernel32_hDLL = 0
  EndIf
EndProcedure

Procedure Kernel32_OpenDLL()

  Kernel32_hDLL = OpenLibrary(#PB_Any, "Kernel32.dll")
  If Kernel32_hDLL = 0
    ProcedureReturn #False
  EndIf

  Global CloseHandle.CloseHandle=GetFunction(Kernel32_hDLL, "CloseHandle")
  Global CreateToolhelp32Snapshot.CreateToolhelp32Snapshot=GetFunction(Kernel32_hDLL, "CreateToolhelp32Snapshot")
  
  CompilerIf #PB_Compiler_Unicode
    Global Process32First.Process32First=GetFunction(Kernel32_hDLL, "Process32FirstW")
    Global Process32Next.Process32Next=GetFunction(Kernel32_hDLL, "Process32NextW")
  CompilerElse
    Global Process32First.Process32First=GetFunction(Kernel32_hDLL, "Process32First")
    Global Process32Next.Process32Next=GetFunction(Kernel32_hDLL, "Process32Next")
  CompilerEndIf  
      
  Global Thread32First.Thread32First=GetFunction(Kernel32_hDLL,"Thread32First")
  Global Thread32Next.Thread32Next=GetFunction(Kernel32_hDLL,"Thread32Next")
  
  ProcedureReturn #True
EndProcedure

If Kernel32_OpenDLL()

  Define Snapshot
  Define ThE32.THREADENTRY32
  Define PE32.PROCESSENTRY32

  PE32\dwSize = SizeOf(PE32)
  Snapshot    = CreateToolhelp32Snapshot(#TH32CS_SNAPPROCESS, 0)
  If Snapshot
    If Process32First(Snapshot, @PE32)
      Repeat
        Debug "==========="
        Debug "Name: " + PeekS(@PE32\szExeFile)
        Debug "PID: " + Str(PE32\th32ProcessID)
        Debug "Parent PID:: " + Str(PE32\th32ParentProcessID)
        Debug "ThreadCount: " + Str(PE32\cntThreads)
        Debug "----------"
      Until Process32Next(Snapshot, @PE32) = #False
    EndIf
    CloseHandle(Snapshot)
  EndIf

  Debug "/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/"

  ThE32\dwSize = SizeOf(ThE32)
  Snapshot = CreateToolhelp32Snapshot(#TH32CS_SNAPTHREAD, 0)
  If Snapshot
    If Thread32First(Snapshot, @ThE32)
      Repeat
        Debug "==========="
        Debug "PID: " + Str(ThE32\th32OwnerProcessID)
        Debug "TID: " + Str(ThE32\th32ThreadID)
        Debug "----------"
      Until Thread32Next(Snapshot, @ThE32) = #False
    EndIf
    CloseHandle(Snapshot)
  EndIf

  Kernel32_CloseDLL()

EndIf

End

So funktioniert es auch ohne Unicode.
PB v5.72 x86/x64
Windows 10 Pro 64bit
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

Re: Windows Threads auslesen

Beitrag von Imhotheb »

Vielen Dank, hat mir einiges an Recherche erspart :D
weil einfach einfach einfach ist ... mach' ich es anders
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Windows Threads auslesen

Beitrag von NicTheQuick »

Wieso so kompliziert mit der DLL?

Code: Alles auswählen

EnableExplicit

Define Snapshot
Define ThE32.THREADENTRY32
Define PE32.PROCESSENTRY32

PE32\dwSize = SizeOf(PE32)
Snapshot    = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS, 0)
If Snapshot
	If Process32First_(Snapshot, @PE32)
		Repeat
			Debug "==========="
			Debug "Name: " + PeekS(@PE32\szExeFile)
			Debug "PID: " + Str(PE32\th32ProcessID)
			Debug "Parent PID:: " + Str(PE32\th32ParentProcessID)
			Debug "ThreadCount: " + Str(PE32\cntThreads)
			Debug "----------"
		Until Process32Next_(Snapshot, @PE32) = #False
	EndIf
	CloseHandle_(Snapshot)
EndIf

Debug "/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/"

ThE32\dwSize = SizeOf(ThE32)
Snapshot = CreateToolhelp32Snapshot_(#TH32CS_SNAPTHREAD, 0)
If Snapshot
	If Thread32First_(Snapshot, @ThE32)
		Repeat
			Debug "==========="
			Debug "PID: " + Str(ThE32\th32OwnerProcessID)
			Debug "TID: " + Str(ThE32\th32ThreadID)
			Debug "----------"
		Until Thread32Next_(Snapshot, @ThE32) = #False
	EndIf
	CloseHandle_(Snapshot)
EndIf
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: Windows Threads auslesen

Beitrag von ts-soft »

NicTheQuick hat geschrieben:Wieso so kompliziert mit der DLL?
- chris - hat geschrieben:So funktioniert es auch ohne Unicode.
PB5.40 vorausgesetzt. Ich denke mal, es ist ein Bug?

// edit:
http://www.purebasic.fr/english/viewtop ... 62#p476962
gerade gefunden!
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
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

Re: Windows Threads auslesen

Beitrag von Imhotheb »

gut zu wissen ... Danke für die weiteren Infos ... aber egal, brauche nur Unicode :twisted:

Macht es eigentlich noch Sinn, irgendetwas in Ascii zu compilieren? ... Win 7 oder höher vorrausgesetzt
weil einfach einfach einfach ist ... mach' ich es anders
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Windows Threads auslesen

Beitrag von NicTheQuick »

Das kommt immer noch auf das Einsatzgebiet an. Aber ich denke, man kommt locker drum herum.
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

Re: Windows Threads auslesen

Beitrag von Imhotheb »

Da Ascii "demnächst" in den Compileroptionen sowieso verschwindet, sehe ich das ganze als obsolet an. Wenn ich es recht bedenke, habe ich noch nie eine Ascii-Exe erstellt. Außer vielleicht zu Testzwecken.
weil einfach einfach einfach ist ... mach' ich es anders
Antworten