如果您的驅動程式呼叫 WdfRequestMarkCancelable 或 WdfRequestMarkCancelableEx,讓 I/O 要求成為可取消的,就有可能發生同步處理問題。 例如,您的驅動程式和裝置可能透過 EvtInterruptIsr 和 EvtInterruptDpc 回呼函式,以非同步方式執行裝置 I/O 操作,同時 EvtInterruptDpc 和 EvtRequestCancel 回呼函式中,可能會包含呼叫 WdfRequestComplete。
驅動程式必須只呼叫 WdfRequestComplete 一次,才能完成或取消要求。 但是,如果 EvtInterruptDpc 和 EvtRequestCancel 回呼函式彼此未同步,則架構可以在另一個函式執行時呼叫一個函式。
如果您的驅動程式使用架構的 自動同步處理,可以輕鬆避免這個問題,因為自動同步處理可確保一次只呼叫一個回呼函式。
如果您的驅動程式未使用框架的自動同步處理,則可以使用 框架鎖定 同步處理取消和完成的程式碼。
無論驅動程式使用框架的自動同步或提供自己的同步,驅動程式的 EvtRequestCancel 回呼函式必須呼叫 WdfRequestComplete 來取消請求。 驅動程式的 EvtInterruptDpc 回呼函式應該呼叫 WdfRequestUnmarkCancelable,如下所示:
Status = WdfRequestUnmarkCancelable(Request);
if( Status != STATUS_CANCELLED ) {
WdfRequestComplete(Request, RequestStatus);
}
此程式代碼可確保驅動程式不會呼叫 WdfRequestComplete,以在驅動程式已呼叫它以取消要求時完成要求。
有關驅動程式呼叫 WdfRequestUnmarkCancelable時必須遵循的規則的詳細資訊,請參閱 WdfRequestUnmarkCancelable。