ACX WDF 驱动程序生命周期管理

本主题提供了 ACX WDF 驱动程序生命周期管理和适当内存清理的摘要。 有关 ACX 的一般概述,请参阅 ACX 音频类扩展概述

注意

ACX 标头和库不包括在 WDK 10.0.22621.2428(2023 年 10 月 24 日发布)中,但在早期版本以及 WDK 的最新(25000 系列内部版本)预览体验预览版中可用。 有关 WDK 预览版本的详细信息,请参阅安装 Windows 驱动程序工具包 (WDK) 的预览版本

ACX WDF 初始化和启动

需要进行适当的 ACX 初始化,以便正确清理 ACX、WDF 和内存资源。 关于此处总结的设备枚举主要阶段的更多详细信息,请参阅 ACX 设备枚举

  • WDM Driver Entry
  • WDF 设备添加
  • WDF 准备硬件
  • WDF 设备 D0 条目
  • ACX 线路创建过程(ACX 引脚和 Jacks 对象与线路相关联)
  • ACX 流创建过程

ACX WDF 对象清理

本主题介绍按此顺序清理 ACX WDF 对象。

  • ACX 流关闭进程
  • ACX 线路删除过程
  • WDF 设备发布硬件
  • WDF 驱动程序卸载

有多种有效的方法可以创建和清理 WDF 和 ACX 对象,本主题介绍管理 ACX/WDF 对象的生存期的一些关键元素。

PnP Power 事件和对象销毁

PnP Power 事件可能导致对象创建和销毁。 有关 PnP Power 事件的详细信息,请参阅 ACX 电源管理以及 WDF PnP 和电源管理回调序列

WDF 对象引用生存期管理

WDF 使用引用计数来帮助跟踪对象的生存期。 在清理回调函数中,可能适合取消引用对象引用。 框架会调用此清理回调函数,以便驱动程序可以调用 WdfObjectDereference(如果以前为要删除的对象调用了 WdfObjectReference)。 有关详细信息,请参阅 WdfObjectReferenceWdfObjectDereference

Surface 团队驱动程序开发最佳实践

有关内存和对象生命周期管理驱动程序代码中常见错误的说明,请参阅 Surface 团队驱动程序开发最佳实践中的这些部分。

ACX 流关闭进程

当客户端关闭流时,驱动程序需要工作才能关闭和清理与流关联的资源。 有关详细信息,请参阅 ACX 流式处理 - 流关闭进程。 请务必注意,驱动程序不清理支持流的资源,并且清理过程必须注意对客户端的影响。

ACX 线路删除过程

ACX 可以根据需要创建动态线路。 这样,驱动程序会调用 WdfPdoInitAllocate 来分配 WDFDEVICE_INIT 结构。 然后,驱动程序指定它想要接收的任何 PnP/power 回调,并创建设备。 驱动程序会调用 AcxDeviceRemoveCircuitDevice 来从设备列表中删除音频设备。

有关详细信息,请参阅 ACX 线路中的 ACX 线路动态删除

WDF 设备发布硬件

EVT_WDF_DEVICE_RELEASE_HARDWARE 回调函数用于在驱动程序的 EvtDeviceReleaseHardware 事件回调函数中执行设备不再可访问时所需的操作。

WDF 设备上下文清理

AudioCodec 示例中的这段代码显示了使用 WDF_OBJECT_ATTRIBUTES 结构来设置 EvtCleanupCallback。

    WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, CODEC_DEVICE_CONTEXT);
    attributes.EvtCleanupCallback = Codec_EvtDeviceContextCleanup;

给出 WdfDevice 的此示例回调清理设备上下文。

VOID
Codec_EvtDeviceContextCleanup(
    _In_ WDFOBJECT      WdfDevice
)

{
    WDFDEVICE               device;
    PCODEC_DEVICE_CONTEXT   devCtx;

    device = (WDFDEVICE)WdfDevice;
    devCtx = GetCodecDeviceContext(device);
    ASSERT(devCtx != nullptr);

    if (devCtx->Capture)
    {
        CodecC_CircuitCleanup(devCtx->Capture);
    }
}

WDF 驱动程序卸载

当卸载驱动程序时,它会释放所有剩余的资源。 有关详细信息,请参阅发布驱动程序分配的资源

驱动程序在调用 WdfDriverCreate 时注册 EvtDriverUnload 回调函数。 EvtDriverUnload 回调函数必须解除分配驱动程序 DriverEntry 例程分配的任何非特定于设备的系统资源。 有关详细信息,请参阅 EVT_WDF_DRIVER_UNLOAD 回调函数

AudioCodec 示例中的这段代码显示驱动程序卸载回调的结构。

EVT_WDF_DRIVER_UNLOAD               AudioCodecDriverUnload;

void AudioCodecDriverUnload(
    _In_ WDFDRIVER Driver
)
{
    PAGED_CODE();

    if (!Driver)
    {
        ASSERT(FALSE);
        return;
    }

    WPP_CLEANUP(WdfDriverWdmGetDriverObject(Driver));

// Here is where you would cleanup any allocated resources associated with the driver.

    return;
}

另请参阅

ACX 设备枚举

ACX 电源管理

PnP 和电源管理回调序列

ACX 对象摘要

ACX 音频类扩展概述

ACX 参考文档