You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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);
}

验证步骤

  1. 使用上述修改后的代码重新编译驱动。
  2. 执行wdfverifier /enable echo.sys 0x00000008并重启系统。
  3. 加载驱动并触发泄漏代码执行。
  4. 卸载驱动,此时Driver Verifier会检测到未释放的WDF对象,触发蓝屏或在调试器中输出详细的泄漏报告。

内容的提问来源于stack exchange,提问作者c00000fd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 02:25:23