在哪里可以找到Windows进程中已卸载模块的列表?

时间:2009-08-17 13:05:51

标签: c++ windows dbghelp

我有一些原生的(如/SUBSYSTEM:NATIVE)Windows程序,我想生成minidump以防万一它们崩溃。通常,我使用dbghelp.dll,但由于本机进程只能使用从ntdll.dll导出的函数,所以我不能。

所以我自己实施了翻斗车。它差不多完成了,但不幸的是,我一直无法在崩溃的进程中找到卸载的模块列表(列表肯定存储在某个地方,因为WinDbg能够显示它。)

在哪里可以找到Windows进程中已卸载模块的列表?

编辑:列表肯定存储在进程内存中的某个位置,即使我在卸载模块后附加了列表,WinDbg也可以显示列表。 the documentation of WinDbg中还有一个注释:

  

Microsoft Windows Server 2003及更高版本的Windows维护用户模式进程的卸载模块列表。 [...]

4 个答案:

答案 0 :(得分:4)

请参阅RtlGetUnloadEventTraceRtlGetUnloadEventTraceEx

我不完全确定它是如何工作的,但我相信实际的列表是由ntdll.dll存储在加载程序代码中的。它跟踪特定进程中最后卸载的16个(或64个,根据MSDN)。该信息未与PEB或PEB_LDR_DATA链接。

答案 1 :(得分:1)

如果您只需要本机进程,则无需查找列表,因为本机进程无法加载任何dll,因此没有任何卸载。但从技术角度来看,我很好奇卸载的数据在哪里。

答案 2 :(得分:0)

WinDbg可能只是创建列表本身。 Windows中的调试器将在程序执行时获取模块加载和卸载事件。因此,调试器只需要观察这些事件并更新列表。

请参阅:http://msdn.microsoft.com/en-us/library/ms679308%28VS.85%29.aspx

具体是关于UNLOAD_DLL_DEBUG_INFOLOAD_DLL_DEBUG_INFO的部分。

我建议你这样做,我不知道任何跟踪卸载模块的内部列表,毕竟,操作系统本身几乎不需要这种类型的数据。

答案 3 :(得分:0)

我猜想这是exe的导入表中列出的模块与当前加载的模块之间的区别。