다음을 통해 공유


ACX WDF 드라이버 수명 관리

이 항목에서는 ACX WDF 드라이버 수명 관리 및 적절한 메모리 클린 요약을 제공합니다. ACX에 대한 일반적인 개요는 ACX 오디오 클래스 확장 개요를 참조하세요.

참고 항목

ACX 헤더 및 라이브러리는 WDK 10.0.22621.2428(2023년 10월 24일 릴리스)에 포함되지 않지만 이전 버전과 WDK의 최신(25000 시리즈 빌드) Insider Preview에서 사용할 수 있습니다. WDK의 미리 보기 버전에 대한 자세한 내용은 WDK (Windows 드라이버 키트)의 미리 보기 버전 설치를 참조하세요.

ACX WDF 초기화 및 시작

ACX, WDF 및 메모리 리소스의 적절한 클린 허용하려면 적절한 ACX 초기화가 발생해야 합니다. 여기에 요약된 디바이스 열거형의 주요 단계에 대한 자세한 내용은 ACX 디바이스 열거형에서 확인할 수 있습니다.

  • WDM 드라이버 항목
  • WDF 디바이스 추가
  • WDF 하드웨어 준비
  • WDF 디바이스 D0 항목
  • ACX 회로 생성 프로세스(ACX 핀 및 잭 개체는 회로와 연결됨)
  • ACX 스트림 만들기 프로세스

ACX WDF 개체 클린up

이 항목에서는 ACX WDF 개체의 클린 순서대로 설명합니다.

  • ACX 스트림 닫기 프로세스
  • ACX 회로 제거 프로세스
  • WDF 디바이스 릴리스 하드웨어
  • WDF 드라이버 언로드

WDF 및 ACX 개체를 만들고 클린 여러 가지 유효한 방법이 있습니다. 이 항목에서는 ACX/WDF 개체의 수명을 관리하는 몇 가지 주요 요소에 대해 설명합니다.

PnP 전원 이벤트 및 개체 소멸

PnP Power 이벤트는 개체 생성 및 소멸을 일으킬 수 있습니다. PnP 전원 이벤트에 대한 자세한 내용은 ACX 전원 관리 및 WDF PnP 및 전원 관리 콜백 시퀀스를 참조하세요.

WDF 개체 참조 수명 관리

WDF는 참조 횟수를 사용하여 개체의 수명을 추적합니다. 클린up 콜백 함수에서 개체 참조를 역참조하는 것이 적절할 수 있습니다. 프레임워크는 이전에 삭제되는 개체에 대해 WdfObjectReference를 호출한 경우 드라이버가 WdfObjectDereference를 호출할 수 있도록 이 클린up 콜백 함수를 호출합니다. 자세한 내용은 WdfObjectReferenceWdfObjectDereference를 참조하세요.

Surface 팀 드라이버 개발 모범 사례

메모리 및 개체 수명 관리가 있는 드라이버 코드에서 발생하는 일반적인 실수에 대한 설명은 Surface Team 드라이버 개발 모범 사례의 해당 섹션을 참조하세요.

ACX 스트림 닫기 프로세스

클라이언트가 스트림을 닫을 때 드라이버는 스트림과 연결된 리소스를 닫고 클린 작업해야 합니다. 자세한 내용은 ACX 스트리밍 - 스트림 닫기 프로세스를 참조 하세요. 드라이버가 스트림을 지원하는 리소스를 클린 않고 클린 up 프로세스가 클라이언트에 미치는 영향을 인식해야 합니다.

ACX 회로 제거 프로세스

ACX는 요청 시 동적 회로를 만들 수 있습니다. 이를 위해 드라이버는 WdfPdoInitAllocate를 호출하여 WDFDEVICE_INIT 구조를 할당합니다. 그런 다음 드라이버는 수신하려는 PnP/전원 콜백을 지정하고 디바이스를 만듭니다. 드라이버는 AcxDeviceRemoveCircuitDevice를 호출하여 디바이스 목록에서 오디오 디바이스를 제거합니다.

자세한 내용은 ACX 회로의 ACX 회로 동적 제거참조하세요.

WDF 디바이스 릴리스 하드웨어

EVT_WDF_DEVICE_RELEASE_HARDWARE 콜백 함수는 드라이버의 EvtDeviceReleaseHardware 이벤트 콜백 함수에서 디바이스에 더 이상 액세스할 수 없을 때 필요한 작업을 수행하는 데 사용됩니다.

WDF 디바이스 컨텍스트 정리

AudioCodec 샘플의 이 코드는 WDF_OBJECT_ATTRIBUTES 구조를 사용하여 EvtCleanupCallback을 설정하는 방법을 보여 줍니다.

    WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, CODEC_DEVICE_CONTEXT);
    attributes.EvtCleanupCallback = Codec_EvtDeviceContextCleanup;

WdfDevice가 디바이스 컨텍스트를 클린 지정된 콜백 예제입니다.

VOID
Codec_EvtDeviceContextCleanup(
    _In_ WDFOBJECT      WdfDevice
)

{
    WDFDEVICE               device;
    PCODEC_DEVICE_CONTEXT   devCtx;

    device = (WDFDEVICE)WdfDevice;
    devCtx = GetCodecDeviceContext(device);
    ASSERT(devCtx != nullptr);

    if (devCtx->Capture)
    {
        CodecC_CircuitCleanup(devCtx->Capture);
    }
}

WDF 드라이버 언로드

드라이버가 언로드되면 모든 재기본 리소스를 해제해야 합니다. 자세한 내용은 드라이버 할당 리소스 해제를 참조 하세요.

드라이버가 WdfDriverCreate를 호출할 때 EvtDriverUnload 콜백 함수를 등록합니다. EvtDriverUnload 콜백 함수는 드라이버의 DriverEntry 루틴이 할당한 비 디바이스별 시스템 리소스의 할당을 취소해야 합니다. 자세한 내용은 EVT_WDF_DRIVER_UNLOAD 콜백 함수를 참조 하세요.

AudioCodec 샘플의 이 코드는 드라이버 언로드 콜백의 구조를 보여줍니다.

EVT_WDF_DRIVER_UNLOAD               AudioCodecDriverUnload;

void AudioCodecDriverUnload(
    _In_ WDFDRIVER Driver
)
{
    PAGED_CODE();

    if (!Driver)
    {
        ASSERT(FALSE);
        return;
    }

    WPP_CLEANUP(WdfDriverWdmGetDriverObject(Driver));

// Here is where you would cleanup any allocated resources associated with the driver.

    return;
}

참고 항목

ACX 디바이스 열거형

ACX 전원 관리

PnP 및 전원 관리 콜백 시퀀스

ACX 개체 요약

ACX 오디오 클래스 확장 개요

ACX 참조 설명서