共用方式為


取消和完成程序代碼的同步化

如果您的驅動程式呼叫 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