How can I enumerate all of the threads in a process given a HANDLE to the process (or a process ID)? I'm interested in doing this so I can further do an EnumThreadWindows on each thread.
Enumerating threads in Windows
Asked Answered
Enumerating threads in a process at MSDN Blogs.
Code snippet from there:
#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>
int __cdecl main(int argc, char **argv)
{
HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if (h != INVALID_HANDLE_VALUE) {
THREADENTRY32 te;
te.dwSize = sizeof(te);
if (Thread32First(h, &te)) {
do {
if (te.dwSize >= FIELD_OFFSET(THREADENTRY32, th32OwnerProcessID) +
sizeof(te.th32OwnerProcessID)) {
printf("Process 0x%04x Thread 0x%04x\n",
te.th32OwnerProcessID, te.th32ThreadID);
}
te.dwSize = sizeof(te);
} while (Thread32Next(h, &te));
}
CloseHandle(h);
}
return 0;
}
It's good to list at least the major API functions needed, so that this answer doesn't become completely useless if the link breaks (MSDN has a habit of changing URLs) –
Cultus
MSDN Blog link broke. Now at devblogs.microsoft.com/oldnewthing/20060223-14/?p=32173 ; formatting of that post is ugly now unfortunately, which is a shame. –
Cesena
The ToolHelp library gives an API for snapshotting processes and enumerating their threads (amongst other properties). See MSDN for details.
// returns the tid of threads in a given process pid. it is recursive and called from a while loop.
// return 0 when there are no more threads.
DWORD EnumerateThreads(DWORD pid)
{// needs working for a simpler loop
char szText[MAX_PATH];
static BOOL bStarted;
static HANDLE hSnapPro, hSnapThread;
static LPPROCESSENTRY32 ppe32;
static PTHREADENTRY32 pte32;
if (!bStarted)
{
if (!bStarted)
{
bStarted++;
pte32 = new THREADENTRY32;
pte32->dwSize = sizeof(THREADENTRY32);
hSnapThread = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if (!hSnapThread)
{
FormatErrorMessage("GetLastError -> hSnapThread = CreateToolhelp32Snapshot\n", GetLastError());
delete pte32;
bStarted = 0;
return 0;
}
if (Thread32First(hSnapThread, pte32))
{
do
{
if (pid == pte32->th32OwnerProcessID)
{
wsprintf(szText, "__yes Thread32First pid: 0x%X - tid: 0x%X\n", pid, pte32->th32ThreadID);
OutputDebugString(szText);
return pte32->th32ThreadID;
}
}
while (Thread32Next(hSnapThread, pte32));
}
else
FormatErrorMessage("GetLastError ->Thread32First\n", GetLastError());
}
}
if (Thread32Next(hSnapThread, pte32))
{
do
{
if (pid == pte32->th32OwnerProcessID)
{
wsprintf(szText, "__yes Thread32First pid: 0x%X - tid: 0x%X\n", pid, pte32->th32ThreadID);
OutputDebugString(szText);
return pte32->th32ThreadID;
}
}
while (Thread32Next(hSnapThread, pte32));
}
else
FormatErrorMessage("GetLastError ->Thread32First\n", GetLastError());
CloseHandle(hSnapThread);
bStarted = 0;
delete pte32;
OutputDebugString("__finished EnumerateThreads\n");
return 0;
}
© 2022 - 2024 — McMap. All rights reserved.