同步處理取消和完成程式碼

如果您的驅動程式呼叫 WdfRequestMarkCancelableWdfRequestMarkCancelableEx 來取消 I/O 要求,就可能發生同步處理問題。 例如,您的驅動程式和裝置可能會透過 EvtInterruptIsrEvtInterruptDpc 回呼函式以非同步方式執行裝置 I/O 作業,而 EvtInterruptDpcEvtRequestCancel 回呼函式可能包含對 WdfRequestComplete的呼叫。

驅動程式必須只呼叫 WdfRequestComplete 一次,才能完成或取消要求。 但是,如果 EvtInterruptDpcEvtRequestCancel 回呼函式彼此未同步處理,架構可以在另一個函式執行時呼叫一個。

如果您的驅動程式使用架構的 自動同步處理,請避免這個問題,因為自動同步處理可確保回呼函式一次呼叫一個。

如果您的驅動程式未使用架構的自動同步處理,它可以使用 架構鎖定 來同步處理取消和完成程式碼。

無論驅動程式使用架構的自動同步處理還是提供自己的同步處理,驅動程式的 EvtRequestCancel 回呼函式都必須呼叫 WdfRequestComplete 來取消要求。 驅動程式的 EvtInterruptDpc 回呼 函式應該呼叫 WdfRequestUnmarkCancelable ,如下所示:

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

此程式碼可確保驅動程式不會呼叫 WdfRequestComplete 來完成要求,如果驅動程式已經呼叫它以取消要求。

如需驅動程式呼叫 WdfRequestUnmarkCancelable時必須遵循之規則的詳細資訊,請參閱 WdfRequestUnmarkCancelable