취소 및 완료 코드 동기화

드라이버 가 WdfRequestMarkCancelable 또는 WdfRequestMarkCancelableEx 를 호출하여 I/O 요청을 취소할 수 있도록 하는 경우 동기화 문제가 발생할 수 있습니다. 예를 들어 드라이버와 디바이스는 EvtInterruptIsr 및 EvtInterruptDpc 콜백 함수를 통해 디바이스 I/O 작업을 비동기적으로 수행할 수 있으며 EvtInterruptDpcEvtRequestCancel 콜백 함수 모두 WdfRequestComplete에 대한 호출을 포함할 수 있습니다.

드라이버는 요청을 완료하거나 취소하려면 WdfRequestComplete 를 한 번만 호출해야 합니다. 그러나 EvtInterruptDpcEvtRequestCancel 콜백 함수가 서로 동기화되지 않은 경우 프레임워크는 다른 함수가 실행되는 동안 하나를 호출할 수 있습니다.

자동 동기화를 사용하면 콜백 함수가 한 번에 하나씩 호출되므로 드라이버에서 프레임워크의 자동 동기화를 사용하는 경우 이 문제를 쉽게 방지할 수 있습니다.

드라이버가 프레임워크의 자동 동기화를 사용하지 않는 경우 프레임워크 잠금 을 사용하여 취소 및 완료 코드를 동기화할 수 있습니다.

드라이버가 프레임워크의 자동 동기화를 사용하든 자체 동기화를 제공하든 관계없이 드라이버의 EvtRequestCancel 콜백 함수는 WdfRequestComplete 를 호출하여 요청을 취소해야 합니다. 드라이버의 EvtInterruptDpc 콜백 함수는 다음과 같이 WdfRequestUnmarkCancelable 을 호출해야 합니다.

Status = WdfRequestUnmarkCancelable(Request);
if( Status != STATUS_CANCELLED ) {
    WdfRequestComplete(Request, RequestStatus);
    }

이 코드는 드라이버가 요청을 취소하기 위해 이미 호출한 경우 드라이버가 WdfRequestComplete 를 호출하여 요청을 완료하지 않도록 합니다.

드라이버가 WdfRequestUnmarkCancelable을 호출할 때 따라야 하는 규칙에 대한 자세한 내용은 WdfRequestUnmarkCancelable을 참조하세요.