I/O 요청 완료

모든 프레임워크 기반 드라이버는 결국 프레임워크에서 수신하는 모든 I/O 요청을 완료해야 합니다. 드라이버는 요청 개체의 WdfRequestComplete, WdfRequestCompleteWithInformation 또는 WdfRequestCompleteWithPriorityBoost 메서드를 호출하여 요청을 완료합니다.

요청을 완료해야 하는 경우

드라이버는 다음 사례 중 하나가 true라고 판단할 때 요청을 완료해야 합니다.

  • 요청된 I/O 작업이 성공적으로 완료되었습니다.

  • 요청된 I/O 작업이 시작되었지만 완료되기 전에 실패했습니다.

  • 요청된 I/O 작업이 지원되지 않거나 수신 당시 유효하지 않아 시작할 수 없습니다.

  • 요청된 I/O 작업이 취소되었습니다.

드라이버가 디바이스에서 I/O 작업을 만들어 I/O 요청을 서비스하는 경우 드라이버는 일반적으로 EvtInterruptDpc 또는 EvtDpcFunc 콜백 함수에서 WdfRequestComplete를 호출합니다.

드라이버가 지원되지 않거나 잘못된 요청을 수신하는 경우 일반적으로 요청을 받은 요청 처리기에서 WdfRequestComplete를 호출합니다.

I/O 작업이 취소된 경우 드라이버는 일반적으로 EvtRequestCancel 콜백 함수에서 WdfRequestComplete를 호출합니다.

드라이버가 I/O 요청을 I/O 대상전달하는 경우 다음과 같이 I/O 대상이 요청을 완료한 후 드라이버가 요청을 완료합니다.

  • 드라이버가 I/O 요청을 I/O 대상에 동기적으로 전달하는 경우 I/O 대상에 대한 드라이버의 호출은 하위 수준 드라이버가 요청을 완료한 후에만 반환됩니다(오류가 발생하지 않는 한). I/O 대상이 반환된 후 드라이버는 WdfRequestComplete를 호출해야 합니다.

  • 드라이버가 I/O 요청을 비동기적으로 전달하는 경우 하위 수준 드라이버가 요청을 완료할 때 드라이버에 알림을 받도록 합니다. 드라이버가 CompletionRoutine 콜백 함수를 등록하는 경우 프레임워크는 I/O 대상이 요청을 완료한 후 이 콜백 함수를 호출합니다. CompletionRoutine 콜백 함수는 일반적으로 WdfRequestComplete를 호출합니다.

CompletionRoutine 콜백 함수를 등록하려면 드라이버가 I/O 요청을 I/O 대상으로 전달하기 전에 WdfRequestSetCompletionRoutine을 호출해야 합니다.

I/O 대상이 비동기적으로 전달된 I/O 요청을 완료할 때 드라이버에 알림을 받을 필요가 없는 경우 드라이버는 CompletionRoutine 콜백 함수를 등록할 필요가 없습니다. 대신 드라이버는 WdfRequestSend를 호출할 때 WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET 플래그를 설정할 수 있습니다. 이 경우 드라이버는 WdfRequestComplete를 호출하지 않습니다.

드라이버는 WdfRequestCreate 또는 WdfRequestCreateFromIrp 를 호출하여 만든 I/O 요청을 완료하지 않습니다. 대신 드라이버가 WdfObjectDelete 를 호출하여 요청 개체를 삭제해야 합니다( 일반적으로 I/O 대상이 요청을 완료한 후).

예를 들어 드라이버는 드라이버의 I/O 대상이 한 번에 처리할 수 있는 것보다 큰 양의 데이터에 대한 읽기 또는 쓰기 요청을 받을 수 있습니다. 드라이버는 데이터를 여러 개의 작은 요청으로 나누고 이러한 작은 요청을 하나 이상의 I/O 대상으로 보내야 합니다. 이 상황을 처리하는 기술은 다음과 같습니다.

  • WdfRequestCreate를 호출하여 더 작은 요청을 나타내는 단일 추가 요청 개체를 만듭니다.

    드라이버는 이 요청을 I/O 대상에 동기적으로 보낼 수 있습니다. 작은 요청의 CompletionRoutine 콜백 함수는 WdfRequestReuse 를 호출하여 드라이버가 요청을 다시 사용하고 I/O 대상으로 다시 보낼 수 있도록 할 수 있습니다. I/O 대상이 작은 요청의 마지막을 완료한 후 CompletionRoutine 콜백 함수는 WdfObjectDelete 를 호출하여 드라이버에서 만든 요청 개체를 삭제할 수 있으며 드라이버는 WdfRequestComplete 를 호출하여 원래 요청을 완료할 수 있습니다.

  • WdfRequestCreate를 호출하여 더 작은 요청을 나타내는 몇 가지 추가 요청 개체를 만듭니다.

    드라이버의 I/O 대상은 이러한 여러 개의 작은 요청을 비동기적으로 처리할 수 있습니다. 드라이버는 작은 각 요청에 대해 CompletionRoutine 콜백 함수를 등록할 수 있습니다. CompletionRoutine 콜백 함수가 호출될 때마다 WdfObjectDelete를 호출하여 드라이버에서 만든 요청 개체를 삭제할 수 있습니다. I/O 대상이 모든 작은 요청을 완료한 후 드라이버는 WdfRequestComplete 를 호출하여 원래 요청을 완료할 수 있습니다.

완료 정보 제공

드라이버가 요청을 완료하면 필요에 따라 다른 드라이버가 액세스할 수 있는 몇 가지 추가 정보를 제공할 수 있습니다. 예를 들어 드라이버는 읽기 또는 쓰기 요청에 대해 전송된 바이트 수를 제공할 수 있습니다. 이 정보를 제공하기 위해 드라이버는 다음 중 하나를 수행할 수 있습니다.

완료 정보 가져오기

다른 드라이버가 완료한 I/O 요청에 대한 정보를 얻으려면 드라이버는 다음을 수행할 수 있습니다.

드라이버가 동기적으로 I/O 요청을 보내는 경우 동기 호출이 반환된 후 일반적으로 WdfRequestGetStatus, WdfRequestGetCompletionParamsWdfRequestGetInformation 을 호출합니다. 드라이버가 I/O 요청을 비동기적으로 보내는 경우 일반적으로 CompletionRoutine 콜백 함수 내에서 이러한 메서드를 호출합니다.

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