EVT_ACX_CIRCUIT_POWER_DOWN回调函数 (acxcircuit.h)

驱动程序使用EVT_ACX_CIRCUIT_POWER_DOWN回调在 ACXCIRCUIT 对象的关机路径中添加功能。

语法

EVT_ACX_CIRCUIT_POWER_DOWN EvtAcxCircuitPowerDown;

NTSTATUS EvtAcxCircuitPowerDown(
  WDFDEVICE Device,
  ACXCIRCUIT Circuit,
  WDF_POWER_DEVICE_STATE TargetState
)
{...}

参数

Device

WDFDEVICE 对象 (WDF - 与指定的 ACXCIRCUIT 关联的 框架对象的摘要) 中所述。

Circuit

ACXCIRCUIT 对象 () 关闭 ACX 对象摘要 中所述。

TargetState

WDF_POWER_DEVICE_STATE类型化枚举器,用于标识设备即将进入的设备电源状态。

返回值

STATUS_SUCCESS如果调用成功,则返回 。 否则,它将返回相应的错误代码。 有关详细信息,请参阅 使用 NTSTATUS 值

注解

若要注册 EvtAcxCircuitPrepareHardware 回调函数,驱动程序必须调用 AcxCircuitInitSetAcxCircuitPnpPowerCallbacks

如果驱动程序已注册 EvtCircuitPowerDown 回调函数,则每次驱动程序的某个设备离开其工作 (D0) 状态时,ACX 框架都会调用该函数。 发生以下情况之一时,设备将保持 D0 状态:

  • 系统及其所有设备即将离开其工作状态并进入低功耗状态。
  • 如果设备支持低功耗空闲,则设备即将进入低功耗状态,因为它处于空闲状态。
  • 即插即用管理器正在尝试重新分发系统的硬件资源。
  • 用户通常通过应用程序的用户界面指示他/她要删除设备。
  • 在意外删除设备后,框架还会调用 EvtCircuitPowerDown 回调函数 (意外删除) 。

有关框架何时调用此回调函数的详细信息,请参阅 PnP 和电源管理方案。

除非设备被意外移除,否则 ACX 框架会在禁用设备的中断之后、在设备电源从 D0 降低之前以及 WDF 在关联设备上调用驱动程序的 EvtDeviceD0Exit 回调之前立即调用此回调函数。 TargetState 参数标识设备即将进入的设备电源状态。

EvtCircuitPowerDown 回调函数必须在 ACXCIRCUT 的硬件进入指定的低功耗状态之前执行任何必要的操作,例如保存驱动程序稍后将 ACXCIRCUIT 的硬件还原到其 D0 电源状态所需的任何信息。

如果 TargetState 为 WdfPowerDeviceD3Final,则应假定系统已关闭、关联的设备即将被删除,或者正在进行资源再平衡。 如果驱动程序必须保存信息,则应将其写入磁盘或其他永久性存储介质。

有关提供此回调函数的驱动程序的详细信息,请参阅 在函数驱动程序中支持 PnP 和电源管理

示例

示例用法如下所示。 此示例演示如何在线路关闭时停止测试代码中的某些计时器实例。

EVT_ACX_CIRCUIT_POWER_DOWN          CodecR_EvtCircuitPowerDown;

NTSTATUS
CreateCircuit()
{
    ...
    ACX_CIRCUIT_PNPPOWER_CALLBACKS_INIT(&powerCallbacks);
    powerCallbacks.EvtAcxCircuitPowerUp = CodecR_EvtCircuitPowerUp;
    powerCallbacks.EvtAcxCircuitPowerDown = CodecR_EvtCircuitPowerDown;
    AcxCircuitInitSetAcxCircuitPnpPowerCallbacks(circuitInit, &powerCallbacks);
    ...
}

NTSTATUS
CodecR_EvtCircuitPowerDown (
    _In_ WDFDEVICE  Device,
    _In_ ACXCIRCUIT Circuit,
    _In_ WDF_POWER_DEVICE_STATE TargetState
    )
{
    UNREFERENCED_PARAMETER(Device);
    UNREFERENCED_PARAMETER(TargetState);
    
    CODEC_RENDER_CIRCUIT_CONTEXT *  circuitCtx;
    CODEC_MUTE_ELEMENT_CONTEXT *    muteCtx;
    CODEC_VOLUME_ELEMENT_CONTEXT *  volumeCtx;

    PAGED_CODE();
    
    // for testing.
    circuitCtx = GetRenderCircuitContext(Circuit);
    ASSERT(circuitCtx);

    ASSERT(circuitCtx->MuteElement);
    muteCtx = GetCodecMuteElementContext(circuitCtx->MuteElement);
    ASSERT(muteCtx);
    
    ASSERT(muteCtx->Timer);
    WdfTimerStop(muteCtx->Timer, TRUE);

    ASSERT(circuitCtx->VolumeElement);
    volumeCtx = GetCodecVolumeElementContext(circuitCtx->VolumeElement);
    ASSERT(volumeCtx);

    ASSERT(volumeCtx->Timer);
    WdfTimerStop(volumeCtx->Timer, TRUE);

    return STATUS_SUCCESS;
}

ACX 要求

最低 ACX 版本: 1.0

有关 ACX 版本的详细信息,请参阅 ACX 版本概述

要求

要求
Header acxcircuit.h
IRQL PASSIVE_LEVEL

另请参阅