다음을 통해 공유


Self-Managed I/O 사용

대부분의 프레임워크 기반 드라이버는 지원하는 디바이스에 대해 프레임워크의 PnP 및 전원 관리 기능을 활용합니다. 즉, 대부분의 프레임워크 기반 드라이버를 통해 프레임워크는 다음을 모두 수행하여 디바이스의 PnP 및 전원 상태를 관리할 수 있습니다.

  • EvtDeviceD0EntryEvtDeviceD0Exit 콜백 함수를 제공합니다.

  • EvtDevicePrepareHardware 및 EvtDeviceReleaseHardware 콜백 함수를 제공합니다.

  • 디바이스가 작동 상태에 있어야 하는 I/O 요청에 대해 전원 관리 큐를 사용하고 다른 모든 요청에 대해 전원 관리되지 않는 큐를 사용합니다.

그러나 몇 가지 프레임워크 기반 드라이버는 다음과 같은 상황에서 드라이버를 포함하여 디바이스의 상태에 대한 더 많은 지식이 필요합니다.

  • 드라이버가 수행하는 작업은 드라이버가 프레임워크 I/O 큐에서 수신하는 I/O 요청 집합에 의해 결정되지 않습니다.

  • 드라이버는 이전의 비 프레임워크 드라이버와 통신하고 WDM 인터페이스를 직접 처리합니다.

  • 드라이버가 수신하는 I/O 요청은 디바이스가 작동 상태에 있어야 하는 그룹과 그렇지 않은 두 그룹으로 나눌 수 없습니다.

대부분의 드라이버는 이전 상황 중 하나에 있지 않지만 드라이버가 있는 경우 디바이스의 PnP 및 전원 관리 작업을 보다 직접 제어해야 할 수 있습니다. 이러한 드라이버는 자체 관리형 I/O를 사용할 수 있습니다. 자체 관리형 I/O를 사용하면, 이 드라이버의 장치 중 하나가 연결되거나 해제될 때마다, 그리고 장치가 일시적으로 중단될 때마다 드라이버는 일련의 콜백 함수로 알림을 받습니다.

드라이버는 자체 관리형 I/O를 사용할 수 있으며, 프레임워크의 I/O 큐를 전원 관리 큐로 사용하거나, 그렇지 않게 사용할 수 있다는 점에 유의하십시오. 예를 들어 드라이버는 자체 관리형 I/O 콜백 함수 집합과 함께 전원 관리가 아닌 프레임워크의 I/O 큐를 사용할 수 있습니다.

자체 관리형 I/O를 사용하기 위해 드라이버는 WdfDeviceInitSetPnpPowerEventCallbacks를 호출할 때 추가 이벤트 콜백 함수 집합을 등록합니다. 이러한 이벤트 콜백 함수는 다음과 같습니다.

  • 디바이스의 I/O 작업을 초기화하고 시작하는 EvtDeviceSelfManagedIoInit입니다.

  • I/O 작업을 일시 중단하는 함수 EvtDeviceSelfManagedIoSuspend.

  • EvtDeviceSelfManagedIoRestart는 일시적으로 중단된 이후 디바이스의 I/O 작업을 재시작하는 기능이다.

  • EvtDeviceSelfManagedIoFlush는 처리되지 않은 I/O 요청을 제거합니다.

  • EvtDeviceSelfManagedIoCleanup은 EvtDeviceSelfManagedIoInit에 의해 할당된 자원을 해제합니다.

디바이스가 처음으로 작업(D0) 상태가 되면 프레임워크는 드라이버의 EvtDeviceSelfManagedIoInit 콜백 함수를 호출합니다. 이 문제는 사용자가 시스템에 디바이스를 연결하고 시스템을 다시 시작할 때마다 발생합니다.

드라이버가 디바이스의 I/O 작업을 중지해야 하는 세 가지 상황이 있습니다. 디바이스가 저전력 상태로 들어가려고 하거나, 제거하려고 하거나, 이미 예기치 않게 제거되었습니다. 다음 목록에서는 이러한 각 상황을 자세히 살펴봅니다.

  • 디바이스가 저전력 상태로 들어가려고 하며 결국 작동 상태로 돌아갑니다.

    장치가 유휴 상태에 있거나 전체 시스템이 저전력 상태로 전환되거나 PnP 관리자가 #A1 시스템 하드웨어 리소스를 재배포할 때, 장치가 저전력 상태로 전환될 준비를 하면 프레임워크는 드라이버의 #B2 #C5 EvtDeviceSelfManagedIoSuspend #A3 #A4 콜백 함수를 호출합니다. 디바이스가 작업 상태로 복귀한 후, 프레임워크는 드라이버의 EvtDeviceSelfManagedIoRestart 콜백 함수를 호출합니다.

  • 디바이스를 제거하려고 합니다.

    사용자가 요청한 디바이스 제거를 처리하기 위해, 프레임워크는 디바이스를 중지하기 전에 드라이버의 EvtDeviceSelfManagedIoSuspend 콜백 함수를 호출합니다. 디바이스를 중지한 후 프레임워크는 드라이버의 EvtDeviceSelfManagedIoFlush 콜백 함수를 호출합니다. 디바이스가 제거된 후 프레임워크는 EvtDeviceSelfManagedIoCleanup 콜백 함수를 호출합니다.

  • 디바이스가 이미 예기치 않게 제거되었습니다(깜짝 제거).

    디바이스 버스에 대한 드라이버가 디바이스가 더 이상 존재하지 않는다고 확인하거나 스택의 다른 드라이버가 디바이스가 응답하지 않는 것으로 확인되면 문제를 발견한 드라이버가 PnP 관리자에게 알릴 수 있습니다. 그런 다음 PnP 관리자는 디바이스가 사라졌다는 것을 나머지 드라이버에 알릴 수 있습니다. 프레임워크 기반 드라이버의 경우, 프레임워크는 PnP 관리자로부터 메시지를 수신하고, 드라이버의 EvtDeviceSelfManagedIoSuspend, EvtDeviceSelfManagedIoFlush, 그리고 EvtDeviceSelfManagedIoCleanup 콜백 함수를 호출합니다.

    (드라이버는 EvtDeviceSurpriseRemoval 콜백 함수를 등록할 수도 있습니다. 디바이스가 제거될 때 작동 중인 D0 상태에 있었다면, 프레임워크는 자체 관리형 I/O 콜백 함수들을 호출하기 전에 EvtDeviceSurpriseRemoval을 호출합니다. 장치가 제거될 때 저전력 상태인 경우, EvtDeviceSurpriseRemovalEvtDeviceSelfManagedIoSuspend 후에 호출됩니다.

프레임워크가 드라이버의 이벤트 콜백 함수를 호출하는 순서에 대한 자세한 내용은 PnP 및 전원 관리 시나리오참조하세요.

비록 드물지만, 프레임워크를 통해 드라이버가 프레임워크의 상태 머신에 접근함으로써 디바이스의 PnP 및 전원 상태를 더욱 세밀하게 제어할 수 있습니다.