为何Driver Verifier无法捕获WDF驱动的WDFMEMORY内存泄漏?
WDF驱动内存泄漏检测失败的原因及解决方法
核心问题分析
你遇到的问题源于WDF框架的对象生命周期管理机制,以及Verifier的检测逻辑,具体原因和解决方法如下:
WDF对象自动回收机制:默认情况下,
WdfMemoryCreate创建的内存对象父对象是驱动对象(WDFDRIVER)。当驱动卸载时,WDF框架会自动递归销毁驱动对象的所有子对象,包括你创建的未手动释放的hMem。因此框架已帮你清理了内存,Verifier判定没有泄漏。Verifier检测时机与阈值:Driver Verifier的WDF泄漏检测是在驱动卸载完成后,检查未被框架回收的对象。另外你只分配了1字节内存,可能被Verifier的极小泄漏过滤机制忽略,建议分配更大的内存(如4KB)来测试。
WDF Verifier配置未生效:仅开启对象追踪不足以触发泄漏告警,需明确开启对象泄漏检测。可通过命令行强制开启:
wdfverifier /enable echo.sys 0x00000008(0x8对应
WDF_VERIFIER_LEAK_DETECTION标志),执行后需重启系统生效。
修改测试代码模拟真实泄漏
要让Verifier捕获到泄漏,需创建框架不会自动回收的对象,示例代码如下:
WDFOBJECT leakParent = NULL; WDFMEMORY hMem = NULL; WDF_OBJECT_ATTRIBUTES attrs; NTSTATUS Status; // 创建自定义父对象,不主动销毁 WDF_OBJECT_ATTRIBUTES_INIT(&attrs); Status = WdfObjectCreate(&attrs, &leakParent); if (!NT_SUCCESS(Status)) { KdPrint(("WdfObjectCreate failed, status=0x%X\n", Status)); return; } // 将内存对象关联到自定义父对象,同时增加父对象引用计数 WDF_OBJECT_ATTRIBUTES_INIT(&attrs); attrs.ParentObject = leakParent; Status = WdfMemoryCreate(&attrs, NonPagedPoolNx, 'aaaa', 4096, &hMem, NULL); if(NT_SUCCESS(Status)) { KdPrint(("WdfMemoryCreate leaked memory!\n")); // 增加引用计数,避免框架自动销毁父对象 WdfObjectReference(leakParent); } else { KdPrint(("WdfMemoryCreate FAIL, status = 0x%X\n", Status)); WdfObjectDelete(leakParent); }
验证步骤
- 使用上述修改后的代码重新编译驱动。
- 执行
wdfverifier /enable echo.sys 0x00000008并重启系统。 - 加载驱动并触发泄漏代码执行。
- 卸载驱动,此时Driver Verifier会检测到未释放的WDF对象,触发蓝屏或在调试器中输出详细的泄漏报告。
内容的提问来源于stack exchange,提问作者c00000fd
相关产品推荐
相关产品推荐

