Поделиться через


функция обратного вызова 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, когда происходит одно из следующих действий:

  • Система и все ее устройства вот-вот покинут свои рабочие состояния и войдут в состояние с низким энергопотреблением.
  • Устройство перейдет в состояние с низким энергопотреблением, так как оно бездействует, если устройство поддерживает маломощное бездействующее.
  • Диспетчер Plug and Play пытается перераспределить аппаратные ресурсы системы.
  • Как правило, с помощью пользовательского интерфейса приложения пользователь указал, что хочет удалить устройство.
  • Платформа также вызывает функцию обратного вызова 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

См. также раздел