如何从 win32 进程获取线程句柄列表?

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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】: Win32: How do I enumerate all the threads belonging to a process in C++? OpenThread 将标识符转换为句柄

【讨论】:

请注意,OpenThread 返回一个备用句柄,而不是原始句柄。除了与原始手柄相比,它对所有事物都很有用。完成此备用 HANDLE 后不要忘记 CloseHandle。

以上是关于如何从 win32 进程获取线程句柄列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中按进程获取打开文件句柄的列表?

Perl - Win32 - 如何从另一个进程非阻塞读取文件句柄?

win32进程概念之句柄表,以及内核对象.

win32 相关同步api

win32 相关同步api

怎么使通过进程打开的win32程序窗口始终置顶