6

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

所以我自己实现了转储程序。它几乎完成了,但不幸的是,我无法在崩溃的进程中找到卸载模块的列表(该列表肯定存储在某个地方,因为 WinDbg 能够显示它)。

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

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

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

4

4 回答 4

4

请参阅RtlGetUnloadEventTraceRtlGetUnloadEventTraceEx

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

于 2009-08-17T21:19:27.197 回答
1

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

于 2009-08-17T21:05:50.827 回答
0

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

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

特别是关于UNLOAD_DLL_DEBUG_INFO和的部分LOAD_DLL_DEBUG_INFO

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

于 2009-08-17T14:21:53.897 回答
0

我会冒险猜测这是 exe 导入表中列出的模块与当前加载的模块之间的差异。

于 2009-08-17T16:10:19.597 回答