대부분의 프레임워크 기반 드라이버는 지원하는 디바이스에 대해 프레임워크의 PnP 및 전원 관리 기능을 활용합니다. 즉, 대부분의 프레임워크 기반 드라이버를 통해 프레임워크는 다음을 모두 수행하여 디바이스의 PnP 및 전원 상태를 관리할 수 있습니다.
EvtDeviceD0Entry 및 EvtDeviceD0Exit 콜백 함수를 제공합니다.
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을 호출합니다. 장치가 제거될 때 저전력 상태인 경우, EvtDeviceSurpriseRemoval은 EvtDeviceSelfManagedIoSuspend 후에 호출됩니다.
프레임워크가 드라이버의 이벤트 콜백 함수를 호출하는 순서에 대한 자세한 내용은 PnP 및 전원 관리 시나리오참조하세요.
비록 드물지만, 프레임워크를 통해 드라이버가 프레임워크의 상태 머신에 접근함으로써 디바이스의 PnP 및 전원 상태를 더욱 세밀하게 제어할 수 있습니다.