簡體   English   中英

在哪里可以找到Windows進程中已卸載模塊的列表?

[英]Where do I find the list of unloaded modules in a Windows process?

我有一些本機(如/SUBSYSTEM:NATIVE )Windows程序,我想生成minidumps以防萬一他們崩潰。 通常,我會使用dbghelp.dll ,但由於本機進程只能使用從ntdll.dll導出的函數,所以我不能。

所以我自己實施了自卸車。 它差不多完成了,但不幸的是,我一直無法在崩潰的進程中找到卸載的模塊列表(列表肯定存儲在某個地方,因為WinDbg能夠顯示它)。

在哪里可以找到Windows進程中已卸載模塊的列表?

編輯:列表肯定存儲在進程內存中的某個位置,即使我在卸載模塊后附加它,WinDbg也可以顯示列表。 WinDbg的文檔中還有一個注釋:

Microsoft Windows Server 2003和更高版本的Windows維護用戶模式進程的卸載模塊列表。 [...]

請參閱RtlGetUnloadEventTraceRtlGetUnloadEventTraceEx

我不完全確定它是如何工作的,但我相信實際列表是由ntdll.dll存儲在加載程序代碼中的。 它跟蹤特定進程中最后卸載的16個(或64個,根據MSDN)。 該信息未與PEB或PEB_LDR_DATA鏈接。

如果您只需要本機進程,則無需查找列表,因為本機進程無法加載任何dll,因此沒有任何卸載。 但從技術角度來看,我很好奇卸載的數據在哪里。

WinDbg可能只是創建列表本身。 Windows中的調試器將在程序執行時獲取模塊加載和卸載事件。 因此,調試器只需要監視這些事件並更新列表。

請參閱: http//msdn.microsoft.com/en-us/library/ms679308%28VS.85%29.aspx

特別是關於UNLOAD_DLL_DEBUG_INFOLOAD_DLL_DEBUG_INFO的部分。

我建議你這樣做,我不知道跟蹤卸載模塊的任何內部列表,畢竟,操作系統本身幾乎不需要這種類型的數據。

我猜想這是exe的導入表中列出的模塊與當前加載的模塊之間的區別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM