OpenThread()通过不同的线程号?

时间:2010-05-31 13:52:19

标签: delphi

我对使用OpenThread函数打开不同的线程并使用NtQueryInformationThread本机函数检查它们感到困惑。 我对NtQueryInformationThread&我可以很好地检查它们。 问题是我不知道如何使用OpenThread循环遍历不同数量的线程 (使用SetDebugPrivilege注意事项)。 假设我们有不同的线程,从5100到5200&我们想要按顺序检查它们:例如5100,5101,5102,5103,5104,5105 ...... 5200 .... 我不知道如何以正确的方式在delphi中使用OpenThread函数.... 我正在使用这种语法&我发现错了:

OpenThread(THREAD_ALL_ACCESS,false,(DWORD)5100)

。 如果有人能指导我如何使用OpenThread虽然线程数不同,那就太棒了。

非常感谢。

1 个答案:

答案 0 :(得分:3)

我不确定你是如何获得具有严格顺序ID的线程的,因为Windows不会(必须)以任何模式分配线程ID。
如果要遍历一组线程,则必须使用工具帮助API:

  1. 调用CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0)以获取系统状态快照
  2. 使用Thread32FirstThread32Next遍历线程并选择要使用的线程(例如,通过其进程的ID)
  3. 使用OpenThread和适当的访问掩码,例如。 THREAD_QUERY_INFORMATION
    不要使用THREAD_ALL_ACCESS,除非您在当前流程中创建了线程,并且您确切知道自己在做什么 (如果你触摸另一个进程的线程,请限制自己进行只读访问)
  4. 做你想做的事,例如。致电NtQueryInformationThread
  5. 不要忘记CloseHandle
  6. 只要不保存线程句柄,就必须处理任何线程终止(并用具有相同ID的新线程替换)的可能性。

    修改(根据要求进一步澄清)
    带有CreateToolhelp32Snapshot的{​​{1}}为您提供当前所有线程现有的系统范围快照(在这种情况下忽略dwFlags == TH32CS_SNAPTHREAD参数),无论他们的状态以及th32ProcessID随后返回的THREADENTRY32结构包含Thread32[First|Next]th32ThreadID字段,您可以使用这些字段来标识该主题。