[英]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維護用戶模式進程的卸載模塊列表。 [...]
請參閱RtlGetUnloadEventTrace和RtlGetUnloadEventTraceEx 。
我不完全確定它是如何工作的,但我相信實際列表是由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_INFO
和LOAD_DLL_DEBUG_INFO
的部分。
我建議你這樣做,我不知道跟蹤卸載模塊的任何內部列表,畢竟,操作系統本身幾乎不需要這種類型的數據。
我猜想這是exe的導入表中列出的模塊與當前加載的模塊之間的區別。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.