首页 > 解决方案 > C++/Win32 - 如何迭代特定进程的线程列表并将起始地址解析为模块?

问题描述

请记住,我是系统编程的新手。

我想做的是获取特定进程的线程列表(包括系统进程,又名 PID 4),并使用模块名称获取每个线程的 PID。

ProcessExplorer 做到了这一点,但我完全不知道他们是如何做到这一点的:(

例子

任何帮助,尤其是代码,将不胜感激。

我通过使用 EnumProcesses (Name to PID) 获取 PID,但对如何实现其他两个必需的功能一无所知。

标签: c++cwindowswinapi

解决方案


我不能代表 ProcessExplorer,但 ProcessHacker 做了类似的事情,我已经看过它的源代码几次。

他们的方法在理论上很简单,但需要一些努力来实现(解析函数名可能很棘手)。

这里或多或少是一步一步的过程:

  • 用于NtQueryInformationThread查询线程的起始地址。(代码在这里
  • 查找该地址属于哪个模块并加载其符号文件(pdb)
  • 现在查询该符号文件以获取该地址处的函数名称(如果存在)。(这里的代码)如果该地址没有函数,它们只是以漂亮的方式返回模块名称和起始地址(ModuleName.dll+<startAddress - moduleBase>

我希望这可以解决一些问题。


推荐阅读