Share via


보낸 요청 취소 동기화

드라이버가 I/O 대상에 전달한 I/O 요청을 취소하려고 하면 드라이버는 유효한 요청 핸들을 WdfRequestCancelSentRequest 메서드에 전달해야 합니다. 드라이버의 CompletionRoutine 콜백 함수가 WdfRequestComplete (요청 개체 삭제 시도)를 호출하기 때문에 I/O 대상이 요청을 완료하면 요청 핸들이 유효하지 않습니다.

이 문제를 방지하기 위해 드라이버는 요청 개체의 컬렉션을 만드는 등 I/O 대상에 보낸 요청을 추적할 수 있습니다. 드라이버는 WdfSpinLockAcquire 를 호출하여 컬렉션에 대한 액세스를 동기화할 수 있습니다.

드라이버의 CompletionRoutine 콜백 함수가 호출되면 잠금을 획득하고, 컬렉션에서 완료된 요청의 핸들을 제거하고, WdfSpinLockRelease 를 호출하여 잠금을 해제합니다.

드라이버가 I/O 대상에 전달한 요청을 취소하기 전에 드라이버는 다음을 수행할 수 있습니다.

  1. WdfSpinLockAcquire를 호출하여 스핀 잠금을 획득합니다.

  2. 드라이버의 완료 루틴이 요청을 완료하지 않았고 컬렉션에서 핸들을 제거하지 않았는지 확인하기 위해 컬렉션에서 요청 개체의 핸들을 찾습니다.

  3. WdfObjectReference를 호출하여 개체를 삭제할 수 없도록 요청 개체의 참조 수를 증분합니다.

  4. WdfSpinLockRelease를 호출하여 스핀 잠금을 해제합니다.

  5. WdfRequestCancelSentRequest를 호출합니다.

  6. WdfObjectDereference를 호출하여 개체의 참조 수를 감소합니다.

이 시퀀스는 드라이버가 WdfRequestCancelSentRequest를 호출하기 전에 I/O 대상이 요청을 완료하는 경우 드라이버의 CompletionRoutine 콜백 함수가 WdfRequestComplete를 호출하더라도 요청 핸들이 여전히 유효합니다(증가된 참조 수로 인해).