2011-03-01 53 views
5

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

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#,这样的首选:]

回答

3

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

+0

如何走栈是可靠的?线程的函数没有设置堆栈偏移量。在线程函数之前也没有确定的调用集合:http://stackoverflow.pastebin.com/e1TLxwuj – Polynomial 2011-03-03 12:41:39

+0

更好的描述我在说什么:http://stackoverflow.pastebin.com/cFNjueAq – Polynomial 2011-03-03 15:20:13

+0

其实,那里是。为了执行堆栈,需要与模块关联的.pdb文件。该文件包含每个堆栈帧的大小等等。 – 2011-03-04 15:00:22