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)를 떠날 때마다 함수를 호출합니다. 다음 중 하나가 발생하면 디바이스가 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

추가 정보