Enumerating threads in Windows

前端 未结 3 790
不思量自难忘°
不思量自难忘° 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: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;
    }
    

提交回复
热议问题