Jus*_* R. 9 windows memory-management driver
如何确定每个设备驱动程序消耗的内存量?我假设这可以使用一些Win32或.NET API完成,但我只是无法确定哪个.
bk1*_*k1e 12
Windows使用池标记跟踪设备驱动程序内存使用情况 如果您知道有问题的驱动程序传递给哪些池标记ExAllocatePoolWithTag,那么您可以使用诸如poolmon(来自Windows驱动程序工具包),PoolTag(来自OSR)或WinDbg(或KD)(来自调试工具)等工具来跟踪其内存使用情况.视窗).
请注意,设备驱动程序可能会调用间接分配内存的内核API.例如,调用IoAllocateMdl将使Windows I/O管理器使用由Windows I/O管理器分配的不同池标记为内存描述符列表分配内存.因此,代表多个设备驱动程序执行的分配可能都使用相同的池标记.
如果您正在尝试确定哪个驱动程序正在泄漏内存,请使用poolmon/PoolTag/WinDbg/KD标识正在泄漏的池标记.然后将内核调试器(WinDbg或KD)附加到系统并将变量nt!poolhittag设置为漏池标记.下一次ExAllocatePoolWithTag调用为该池标记分配内存,系统将进入内核调试器,然后您可以查看调用堆栈以确定哪个驱动程序正在执行分配.在使用内核调试器查找内核模式内存泄漏中更详细地描述了此过程.
我知道这不是一件小事。以下是密切相关问题的一些出发点:
您可以通过使用VirtualQueryEx来确定 PE 文件、堆等使用的内存(可能不令人满意)。这是一个提供虚拟内存映射视图的程序。这应该回答设备驱动程序的图像大小。
更大的困难在于确定如何标记由分配内存的代码动态分配的内存。最好的办法是使用诸如detours之类的东西来跟踪动态内存分配,并遍历堆栈以确定发起者。最后,您希望对设备驱动程序执行此操作这一事实更进一步。我怀疑弯路是否可以用于设备驱动程序(尽管我不确定)。我确实知道从设备驱动程序遍历堆栈非常重要。
您还可以从SysInternals 套件中的 ProcExp 获取所需的数据。运行它转到“系统”,转到查看/显示下部窗格,启用 Dll。然后右键单击列标题并添加工作集的标题,例如“WS Total”。我不确定这对正确标记它们的记忆有什么作用。在我的盒子上,它为他们提供了设备驱动程序的映射图像大小,但工作集列中只有 0K。我认为 procexp 没有给出答案是合理的证据,表明解决这个问题不会很快。
祝你好运。