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 回呼函式,則 ACX 架構會在每次驅動程式的裝置離開其運作 (D0) 狀態時呼叫函式。 當發生下列其中一項時,裝置會離開 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

另請參閱