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
与指定的 ACXCIRCUIT 关联的 WDFDEVICE 对象(WDF - 框架对象摘要)对象。
Circuit
ACXCIRCUIT 对象(ACX 对象摘要中所述)已关闭。
TargetState
WDF_POWER_DEVICE_STATE 类型化枚举器,用于标识设备即将输入的设备电源状态。
返回值
如果调用成功,则返回 STATUS_SUCCESS
。 否则,它将返回适当的错误代码。 有关详细信息,请参阅 使用 NTSTATUS 值。
言论
若要注册 EvtAcxCircuitPrepareHardware 回调函数,驱动程序必须调用 AcxCircuitInitSetAcxCircuitPnpPowerCallbacks。
如果驱动程序注册了 EvtCircuitPowerDown 回调函数,则 ACX 框架每次驱动程序的设备离开其工作状态(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 版本概述。
要求
要求 | 价值 |
---|---|
标头 | acxcircuit.h |
IRQL | PASSIVE_LEVEL |
另请参阅
- acxcircuit.h 标头
- 在函数驱动程序 中支持 PnP 和电源管理