从线程信息获取模块名称

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

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

不幸的是,这似乎并不是一个具体的做法。 xfire_toucan.dll模块显示在处理程序罚款:

 1972 : xfire_toucan.dll!ToucanSendGamestatsConsoleLine_V1+0x80 

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

任何想法如何获得模块像ProcExp呢?

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

进程资源管理器不显示与每个线程关联的模块。 Windows不保留这些信息。 它显示了线程入口点的符号名称。 这通常(但不总是)是启动线程的模块中的一个函数。 如果您想在程序中检索这类信息,可以使用调试帮助API。 他们可能使用StackWalk64函数来检索入口点名称。