从线程信息中获取模块名称

时间:2011-03-01 16:10:24

标签: c# windows multithreading winapi module

我正在尝试获取进程中每个线程的模块名称。进程资源管理器显示与每个线程关联的模块的名称没有问题。我可以毫无问题地枚举当前进程中的所有模块和所有线程,并获取与它们相关的数据。我目前推断相关模块的方法如下:

if(module.BaseAddress < thread.StartAddress && (module.BaseAddress + module.BaseMemorySize) > thread.StartAddress)
{
    // this is our module ;)
}

不幸的是,这似乎并不是一个具体的方法。 xfire_toucan.dll模块在procexp中显示正常:

1972 : xfire_toucan.dll!ToucanSendGamestatsConsoleLine_V1+0x80

在模块列表中,它显示的基本地址为0x10000000,大小为0x26b000,为我们提供了0x1026b000的最大内存地址。但是,关联的线程起始地址是0x775e2ca0,它是模块主存储器范围之外的进程中已分配的内存块的一部分。

知道如何获得像ProcExp这样的模块吗?

我知道C和C#,所以要么很好,但我的项目是C#所以这是首选:]

1 个答案:

答案 0 :(得分:3)

Process explorer没有向您显示与每个线程关联的模块。 Windows不保留此信息。它显示了线程入口点的符号名称。这通常(但不总是)是启动线程的模块中的函数。如果要在程序中检索此类信息,可以使用调试帮助API。他们可能正在使用StackWalk64函数来检索入口点名称。