I/O 요청 취소

애플리케이션, 시스템 또는 드라이버에서 디바이스의 진행 중인 I/O 작업(예: 디스크에서 여러 블록을 읽는 요청)을 취소할 수 있습니다. 디바이스의 I/O 작업이 취소된 경우 I/O 관리자는 I/O 작업과 연결된 처리되지 않은 모든 I/O 요청을 취소하려고 시도합니다. I/O 관리자가 I/O 요청을 취소하려고 할 때 디바이스의 드라이버가 알림을 받도록 등록할 수 있으며, 드라이버는 STATUS_CANCELLED 완료 상태 완료하여 소유한 요청을 취소할 수 있습니다.

프레임워크는 프레임워크 기반 드라이버에 대한 취소 작업 중 일부를 처리합니다. 디바이스의 I/O 작업이 취소된 경우 프레임워크는 취소된 작업과 연결된 다음 I/O 요청(STATUS_CANCELLED 완료 상태 포함)을 완료합니다.

  • 배달되지 않은 I/O는 프레임워크가 드라이버의 기본 I/O 큐에 배치한 것을 요청합니다.

  • 배달되지 않은 I/O는 드라이버가 WdfDeviceConfigureRequestDispatching이라는 이유로 프레임워크가 다른 큐로 전달하도록 요청합니다.

프레임워크는 이러한 요청을 취소하므로 드라이버에 전달하지 않습니다.

프레임워크가 드라이버에 I/O 요청을 전달한 후 드라이버는 요청을 소유하고 프레임워크는 취소할 수 없습니다. 이 시점에서는 드라이버만 I/O 요청을 취소할 수 있지만 프레임워크는 요청을 취소해야 한다고 드라이버에 알려야 합니다. 드라이버는 EvtRequestCancel 콜백 함수를 제공하여 이 알림을 받습니다.

경우에 따라 드라이버는 I/O 큐에서 I/O 요청을 수신하지만, 요청을 처리하는 대신 드라이버가 나중에 처리하기 위해 동일한 또는 다른 I/O 큐에 요청을 다시 큐에 추가합니다. 이 상황의 예는 다음과 같습니다.

이러한 경우 요청이 I/O 큐에 있으므로 프레임워크에서 I/O 요청을 취소할 수 있습니다. 그러나 드라이버가 요청이 있는 I/O 큐에 대해 EvtIoCanceledOnQueue 콜백 함수를 등록한 경우 프레임워크는 연결된 I/O 작업이 취소될 때 요청을 취소하는 대신 콜백 함수를 호출합니다. 프레임워크가 드라이버의 EvtIoCanceledOnQueue 콜백 함수를 호출하는 경우 드라이버는 요청을 완료 해야 합니다.

요약하자면, I/O 작업이 취소되면 프레임워크는 항상 드라이버에 전달되지 않은 연결된 모든 I/O 요청을 취소합니다. 드라이버가 요청을 받은 다음 다시 큐에 넣은 경우 드라이버가 I/O 큐에 대한 EvtIoCanceledOnQueue 콜백 함수를 제공하지 않는 한 프레임워크는 요청을 취소합니다(요청이 큐에 있는 경우).

WdfRequestMarkCancelable 또는 WdfRequestMarkCancelableEx 호출

드라이버는 WdfRequestMarkCancelable 또는 WdfRequestMarkCancelableEx 를 호출하여 EvtRequestCancel 콜백 함수를 등록할 수 있습니다. 드라이버가 WdfRequestMarkCancelable 또는 WdfRequestMarkCancelableEx를 호출하고 요청과 연결된 I/O 작업이 취소된 경우 프레임워크는 드라이버가 I/O 요청을 취소할 수 있도록 드라이버의 EvtRequestCancel 콜백 함수를 호출합니다.

드라이버는 비교적 오랜 시간 동안 요청을 소유하는 경우 WdfRequestMarkCancelable 또는 WdfRequestMarkCancelableEx 를 호출해야 합니다. 예를 들어 드라이버는 디바이스가 응답할 때까지 기다려야 하거나 드라이버가 단일 요청을 받았을 때 만든 요청 집합을 완료할 때까지 낮은 드라이버가 대기할 수 있습니다.

드라이버가 WdfRequestMarkCancelable 또는 WdfRequestMarkCancelableEx를 호출하지 않거나 드라이버가 WdfRequestMarkCancelable 또는 WdfRequestMarkCancelableEx를 호출한 후 WdfRequestUnmarkCancelable을 호출하는 경우 드라이버는 취소를 인식하지 못하므로 요청을 정상적으로 처리합니다.

WdfRequestIsCanceled 호출

드라이버가 WdfRequestMarkCancelable 또는 WdfRequestMarkCancelableEx 를 호출하여 EvtRequestCancel 콜백 함수를 등록하지 않은 경우 WdfRequestIsCanceled 를 호출하여 I/O 관리자가 I/O 요청을 취소하려고 했는지 확인할 수 있습니다. WdfRequestIsCanceledTRUE를 반환하고 드라이버가 요청을 소유하는 경우 드라이버는 요청을 취소해야 합니다. 드라이버가 요청을 소유하지 않으면 WdfRequestIsCanceled를 호출하면 안 됩니다.

WdfRequestMarkCancelable 또는 WdfRequestMarkCancelableEx를 호출하지 않은 드라이버는 다음과 같은 상황에서 WdfRequestIsCanceled를 호출할 수 있습니다.

요청 취소

I/O 요청을 취소하는 데는 다음 중 하나라도 포함될 수 있습니다.

  • 진행 중인 I/O 작업을 중지합니다.

  • I/O 대상에 요청을 전달하지 않습니다.

  • WdfRequestCancelSentRequest를 호출하여 드라이버가 이전에 I/O 대상에 제출한 요청을 취소하려고 시도합니다.

드라이버가 프레임워크에서 받은 요청 개체에 대한 I/O 요청을 취소하는 경우 드라이버는 항상 상태 매개 변수가 STATUS_CANCELLED WdfRequestComplete, WdfRequestCompleteWithInformation 또는 WdfRequestCompleteWithPriorityBoost를 호출하여 요청을 완료해야 합니다. (드라이버가 WdfRequestCreate 를 호출하여 요청 개체를 만드는 경우 드라이버는 요청을 완료하는 대신 WdfObjectDelete 를 호출합니다.)

취소 동기화

I/O 요청을 취소하는 코드를 동기화하는 방법에 대한 자세한 내용은 다음을 참조하세요.