我有一些原生的(如/SUBSYSTEM:NATIVE
)Windows程序,我想生成minidump以防万一它们崩溃。通常,我使用dbghelp.dll
,但由于本机进程只能使用从ntdll.dll
导出的函数,所以我不能。
所以我自己实施了翻斗车。它差不多完成了,但不幸的是,我一直无法在崩溃的进程中找到卸载的模块列表(列表肯定存储在某个地方,因为WinDbg能够显示它。)
在哪里可以找到Windows进程中已卸载模块的列表?
编辑:列表肯定存储在进程内存中的某个位置,即使我在卸载模块后附加了列表,WinDbg也可以显示列表。 the documentation of WinDbg中还有一个注释:
Microsoft Windows Server 2003及更高版本的Windows维护用户模式进程的卸载模块列表。 [...]
答案 0 :(得分:4)
请参阅RtlGetUnloadEventTrace和RtlGetUnloadEventTraceEx。
我不完全确定它是如何工作的,但我相信实际的列表是由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_INFO
和LOAD_DLL_DEBUG_INFO
的部分。
我建议你这样做,我不知道任何跟踪卸载模块的内部列表,毕竟,操作系统本身几乎不需要这种类型的数据。
答案 3 :(得分:0)
我猜想这是exe的导入表中列出的模块与当前加载的模块之间的区别。