Seite 1 von 1

Windows Threads auslesen

Verfasst: 22.11.2015 13:24
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

Re: Windows Threads auslesen

Verfasst: 22.11.2015 14:52
von - chris -
Until Thread32Next_(Snapshot, @ThE32)

Da fehlt das #False

Re: Windows Threads auslesen

Verfasst: 22.11.2015 15:12
von Imhotheb
Ohhh man .... :lamer: ... Manchmal sitzt man einfach auf der Leitung. ... Danke für den Korkenzieher :coderselixir:

Re: Windows Threads auslesen

Verfasst: 22.11.2015 15:39
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.

Re: Windows Threads auslesen

Verfasst: 23.11.2015 01:11
von Imhotheb
Vielen Dank, hat mir einiges an Recherche erspart :D

Re: Windows Threads auslesen

Verfasst: 23.11.2015 11:34
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

Re: Windows Threads auslesen

Verfasst: 23.11.2015 12:24
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!

Re: Windows Threads auslesen

Verfasst: 23.11.2015 13:20
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

Re: Windows Threads auslesen

Verfasst: 23.11.2015 13:47
von NicTheQuick
Das kommt immer noch auf das Einsatzgebiet an. Aber ich denke, man kommt locker drum herum.

Re: Windows Threads auslesen

Verfasst: 23.11.2015 15:05
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.