如何从 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 进程获取线程句柄列表?的主要内容,如果未能解决你的问题,请参考以下文章