Enumerating threads in Windows

前端 未结 3 777
不思量自难忘°
不思量自难忘° 2020-11-29 10:24

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 o

相关标签:
3条回答
  • 2020-11-29 11:04

    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;
    }
    
    0 讨论(0)
  • 2020-11-29 11:08

    The ToolHelp library gives an API for snapshotting processes and enumerating their threads (amongst other properties). See MSDN for details.

    0 讨论(0)
  • 2020-11-29 11:24
    // 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;
    }
    
    0 讨论(0)
提交回复
热议问题