Winapi 在vista之前的系统上获取线程ID?

Winapi 在vista之前的系统上获取线程ID?,winapi,windows-vista,multithreading,portability,Winapi,Windows Vista,Multithreading,Portability,显然,GetThreadId是一个Vista API。如何在pre-vista系统上获取线程id?如果您能以某种方式调用有问题的线程并将其存储在某个位置,您可以读取结果。有几个选项: 当你打电话的时候,你会得到控制权 您可以调用以获取当前线程的ID 您可以使用/枚举线程 如果有问题的线程经常进入可警报的等待状态,您可以向其发送一个APC,其中包含:;然后,APC处理程序可以使用您喜欢的任何方法调用并将结果传回调用方 您也可以使用未记录的NT函数来执行此操作。在类上使用将在中提供线程ID。可以在

显然,GetThreadId是一个Vista API。如何在pre-vista系统上获取线程id?

如果您能以某种方式调用有问题的线程并将其存储在某个位置,您可以读取结果。

有几个选项:

  • 当你打电话的时候,你会得到控制权
  • 您可以调用以获取当前线程的ID
  • 您可以使用/枚举线程

如果有问题的线程经常进入可警报的等待状态,您可以向其发送一个APC,其中包含:;然后,APC处理程序可以使用您喜欢的任何方法调用并将结果传回调用方

您也可以使用未记录的NT函数来执行此操作。在类上使用将在中提供线程ID。可以在中找到一个示例。但是,我不确定这在什么版本的windows上可用-请记住这些未记录的函数可以随时更改,因此最好在您感兴趣的旧版本的windows上测试它们,只要在可用的地方使用GetThreadId()


请注意,这些未记录的函数只能由NTDLL上的LoadLibrary()和GetProcAddress()访问;它们没有导入库,数据结构的声明可以在
Winternl.h
中找到,但如果没有,请根据上面的内部链接自己定义它们。

在枚举案例中,有没有办法确定哪个枚举线程对应于您拥有的句柄?您可以使用TH32CS_SNAPMODULE标志将当前进程句柄传递给CreateToolhelp32Snapshot。这只会枚举进程中的线程。但它不会让您区分模块中线程之间的差异,是吗?当然,您可以从枚举中获得句柄,但如何比较从不同来源获得的两个线程句柄?是的,但如何匹配句柄?AFAICS,一旦你有了两个线程句柄,你就不知道它们是否指向同一个线程。这对我来说效果最好,只需调用create并用threadhandle存储它!感谢所有感兴趣的人以下是如何调用
NtQueryInformationThread