EVT_ACX_CIRCUIT_POWER_DOWN función de devolución de llamada (acxcircuit.h)

El controlador usa la EVT_ACX_CIRCUIT_POWER_DOWN devolución de llamada para agregar funcionalidad en la ruta de acceso de encendido de un objeto ACXCIRCUIT.

Sintaxis

EVT_ACX_CIRCUIT_POWER_DOWN EvtAcxCircuitPowerDown;

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

Parámetros

Device

Objeto WDFDEVICE (descrito en WDF - Resumen de objetos de marco) asociado al ACXCIRCUIT especificado.

Circuit

Objeto ACXCIRCUIT (descrito en Resumen de objetos ACX) apagado.

TargetState

Enumerador con tipo WDF_POWER_DEVICE_STATE que identifica el estado de alimentación del dispositivo que el dispositivo está a punto de escribir.

Valor devuelto

Devuelve STATUS_SUCCESS si la llamada se realizó correctamente. De lo contrario, devuelve un código de error adecuado. Para obtener más información, vea Uso de valores NTSTATUS.

Comentarios

Para registrar una función de devolución de llamada EvtAcxCircuitPrepareHardware, un controlador debe llamar a AcxCircuitInitSetAcxCircuitPnpPowerCallbacks.

Si el controlador ha registrado una función de devolución de llamada EvtCircuitPowerDown, el marco ACX llama a la función cada vez que uno de los dispositivos del controlador deja su estado de funcionamiento (D0). Un dispositivo deja el estado D0 cuando se produce una de las siguientes acciones:

  • El sistema y todos sus dispositivos están a punto de dejar sus estados de trabajo y entrar en un estado de bajo consumo.
  • El dispositivo está a punto de entrar en un estado de bajo consumo porque está inactivo, si el dispositivo admite inactividad de bajo consumo.
  • El administrador de Plug and Play está intentando redistribuir los recursos de hardware del sistema.
  • Un usuario ha indicado, normalmente por medio de la interfaz de usuario de una aplicación, que quiere quitar el dispositivo.
  • El marco también llama a la función de devolución de llamada EvtCircuitPowerDown después de que un dispositivo se haya quitado inesperadamente (se ha quitado sorpresa).

Para obtener más información sobre cuándo el marco llama a esta función de devolución de llamada, consulte Escenarios de administración de energía y PnP.

A menos que el dispositivo se haya quitado sorpresa, el marco ACX llama a esta función de devolución de llamada inmediatamente después de deshabilitar las interrupciones del dispositivo, pero antes de que la alimentación del dispositivo se reduzca de D0 y antes de que WDF invoque la devolución de llamada EvtDeviceD0Exit del controlador en los dispositivos asociados. El parámetro TargetState identifica el estado de alimentación del dispositivo que el dispositivo está a punto de entrar.

La función de devolución de llamada EvtCircuitPowerDown debe realizar las operaciones necesarias antes de que el hardware de ACXCIRCUT entre en el estado de baja potencia especificado, como guardar cualquier información que el controlador necesite más adelante para restaurar el hardware de ACXCIRCUIT a su estado de alimentación D0.

Si TargetState es WdfPowerDeviceD3Final, debe suponer que el sistema se está desactivando, el dispositivo asociado está a punto de quitarse o está en curso un reequilibrio de recursos. Si el controlador debe guardar información, debe escribirla en el disco o en algún otro medio de almacenamiento permanente.

Para obtener más información sobre los controladores que proporcionan esta función de devolución de llamada, consulte Compatibilidad con PnP y Administración de energía en el controlador de funciones.

Ejemplo

A continuación se muestra el uso de ejemplo. En este ejemplo se muestra la detención de algunas instancias del temporizador en el código de prueba cuando el circuito se apaga.

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;
}

Requisitos de ACX

Versión mínima de ACX: 1.0

Para obtener más información sobre las versiones de ACX, consulte Introducción a la versión de ACX.

Requisitos

Requisito Valor
Header acxcircuit.h
IRQL PASSIVE_LEVEL

Consulte también