2008-12-27 73 views

回答

1

我知道這是不平凡的。這裏有一些出發點密切相關的問題:

你可以得到一個(可能不理想)通過使用VirtualQueryEx來確定PE文件,堆等所使用的內存從這裏開始是一個程序,它提供Virtual memory map視圖。這應該回答設備驅動程序的圖像大小。

更大的困難是確定如何標記由分配它的代碼動態分配的內存。最好的方法是使用像detours這樣的東西來跟蹤動態內存分配,因爲它們是製作的,然後走棧以確定組件。最後,您希望爲設備驅動程序執行此操作的事實需要更進一步。我懷疑繞道可以用於設備驅動程序(雖然我不知道肯定)。我知道從設備驅動程序中走棧非常重要。

您可能也可以在SysInternals suite中從ProcExp獲取所需的數據。運行它轉到'系統',轉到查看/顯示下部窗格,啓用Dll的。然後右鍵單擊列標題並添加工作集的標題,例如'WS Total'。我不確定這會如何正確標記它們的內存。在我的盒子上,它給了他們映射設備驅動程序的映像大小,但在工作集列中只有0K。我認爲procexp缺乏答案作爲合理的證據表明解決這個問題不會很快。

祝你好運。

+0

這太棒了! Process Explorer再次通過。雖然工作集數據只是0,但可以獲得物理內存基址和映射大小,這是朝着正確方向邁出的一大步。 – 2008-12-27 23:57:44

12

Windows使用池標記跟蹤設備驅動程序的內存使用情況。如果你知道什麼是池標記有問題的驅動程序傳遞到ExAllocatePoolWithTag,那麼你就可以使用工具,如poolmon(從Windows驅動程序工具包),PoolTag(從OSR),或WinDbg (or KD)跟蹤它的內存使用(從Windows調試工具) 。

請注意,設備驅動程序可能會調用間接分配內存的內核API。例如,調用IoAllocateMdl將導致Windows I/O管理器使用由Windows I/O管理器分配的不同池標籤爲內存描述符列表分配內存。因此,代表多個設備驅動程序執行的分配可能都使用相同的池標記。

如果您試圖確定哪個驅動程序正在泄漏內存,請使用poolmon/PoolTag/WinDbg/KD標識正在泄露的池標記。然後,將內核調試程序(WinDbg或KD)附加到系統,並將變量nt!poolhittag設置爲泄漏池標記。下次調用ExAllocatePoolWithTag來分配帶有該池標籤的內存時,系統將進入內核調試程序,然後您可以查看調用堆棧以確定哪個驅動程序正在執行分配。這個過程在Using the Kernel Debugger to Find a Kernel-Mode Memory Leak中有更詳細的描述。

+0

這是正確的答案。 如果你想跟蹤單個驅動程序,該程序的檢驗「可能會幫助你更容易,只需撥打「verifier.exe」在命令提示符下。有了這個工具,你可以跟蹤一個驅動程序。 – Christopher 2009-07-16 14:09:13

相關問題