同步處理已傳送要求的取消

當驅動程式嘗試取消已轉送至 I/O 目標的 I/O 要求時,驅動程式必須確定它會將有效的要求控制碼傳遞給 WdfRequestCancelSentRequest 方法。 如果 I/O 目標完成要求,要求控制碼會變成無效,因為驅動程式的 CompletionRoutine 回呼函式會呼叫 WdfRequestComplete (嘗試刪除要求物件) 。

為避免這個問題,驅動程式可以追蹤它傳送至 I/O 目標的要求,例如建立要求物件的 集合 。 驅動程式可以呼叫 WdfSpinLockAcquire 來同步存取集合。

呼叫驅動程式的 CompletionRoutine 回呼函式時,它會取得鎖定、從集合中移除已完成要求的控制碼,以及呼叫 WdfSpinLockRelease 以釋放鎖定。

嘗試取消驅動程式已轉送至 I/O 目標的要求之前,驅動程式可以:

  1. 呼叫 WdfSpinLockAcquire 以取得微調鎖定。

  2. 在集合中尋找要求物件的控制碼,以確保驅動程式的完成常式尚未完成要求,並從集合中移除控制碼。

  3. 呼叫 WdfObjectReference 以遞增要求物件的參考計數,以便無法刪除物件。

  4. 呼叫 WdfSpinLockRelease 以釋放微調鎖定。

  5. 呼叫 WdfRequestCancelSentRequest

  6. 呼叫 WdfObjectDereference 以遞減物件的參考計數。

此順序可確保如果 I/O 目標在驅動程式呼叫 WdfRequestCancelSentRequest之前完成要求,要求控制碼仍然有效 (,因為即使驅動程式的 CompletionRoutine 回呼函式呼叫 WdfRequestComplete,還是會因為遞增的參考計數) 。