Self-Managed I/O 사용

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

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

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

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

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

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

드라이버는 자체 관리형 I/O를 사용하고 여전히 전원 관리형 큐로 프레임워크의 I/O 큐를 사용할 수 있습니다. 예를 들어 드라이버는 자체 관리형 I/O 콜백 함수 집합과 함께 전원 관리가 아닌 프레임워크의 I/O 큐를 사용할 수 있습니다.

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

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

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

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

    디바이스가 저전력 상태로 전환하려고 할 때(디바이스가 유휴 상태이거나 전체 시스템이 저전력 상태로 전환되거나 PnP 관리자가 시스템 하드웨어 리소스를 재배포하고 있기 때문에) 프레임워크는 드라이버의 EvtDeviceSelfManagedIoSuspend 콜백 함수를 호출합니다. 디바이스가 작동 상태를 다시 입력한 후 프레임워크는 드라이버의 EvtDeviceSelfManagedIoRestart 콜백 함수를 호출합니다.

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

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

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

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

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

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

거의 필요하지 않지만 프레임워크를 사용하면 드라이버가 프레임워크의 상태 컴퓨터에 액세스하여 디바이스의 PnP 및 전원 상태를 더욱 제어할 수 있습니다.