【问题标题】:How to obtain list of thread handles from a win32 process?如何从 win32 进程获取线程句柄列表?
【发布时间】:2012-04-01 15:48:37
【问题描述】:

是否可以在任何给定时间为 win32(c++ 中)上的当前进程获取线程句柄列表?

【问题讨论】:

    标签: c++ windows multithreading


    【解决方案1】:

    您会发现this article 很有帮助。它提供了线程枚举的代码,其中包含使用tool help library 带来的细微差别。

    为方便起见(摘自文章):

    #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;
    }
    

    【讨论】:

    • 遗憾的是,这使您可以访问线程的 ID,而不是请求者要求的 HANDLE。似乎没有任何 API 可以从 ID 中获取 HANDLE。 ID 上的 OpenThread 返回一个备用 HANDLE。
    • 提醒一下,“toolhelp”API 速度太慢了...我建议直接调用NtQuerySystemInformation
    【解决方案2】:

    【讨论】:

    • 请注意,OpenThread 返回一个备用句柄,而不是原始句柄。除了与原始手柄相比,它对所有事物都很有用。完成此备用 HANDLE 后不要忘记 CloseHandle。
    猜你喜欢
    • 1970-01-01
    • 2010-12-30
    • 2016-05-08
    • 2022-01-16
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多