请记住,我是系统编程的新手。
我试图做的是获取特定进程的线程列表(包括系统进程,又名 PID 4),并获取每个线程的 PID 和模块名称。
ProcessExplorer 会这样做,但我完全不知道他们是怎么做到的:(
任何帮助,尤其是代码方面的帮助,我们将不胜感激。
我通过使用 EnumProcesses (Name to PID) 获取 PID 但是对于如何实现另外两个必需的功能一无所知。
最佳答案
我不能代表 ProcessExplorer,但 ProcessHacker 做了类似的事情,我已经查看了它的源代码几次。
它们的方法在理论上很简单,但需要付出一些努力才能实现(解析函数名称可能很棘手)。
这里或多或少是一步一步的过程:
- 使用
NtQueryInformationThread
查询线程的起始地址。 ( Code here ) - 找到该地址属于哪个模块并加载它的符号文件(pdb)
- 现在查询该符号文件以获取该地址处的函数名称(如果存在)。 ( Code here ) 如果该地址没有函数,他们只是以一种漂亮的方式返回模块名称和起始地址 (
ModuleName.dll+<startAddress - moduleBase>
)
我希望这能澄清一些事情。
关于C++/Win32 - 如何迭代特定进程的线程列表并将起始地址解析为模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57133611/