正在完成 I/O 要求

每個架構型驅動程式最終都必須完成它從架構接收的每個 I/O 要求。 驅動程式會呼叫要求物件的 WdfRequestCompleteWdfRequestCompleteWithInformationWdfRequestCompleteWithPriorityBoost 方法來完成要求。

完成要求的時機

驅動程式在判斷下列其中一個案例成立時,必須完成要求:

  • 要求的 I/O 作業已順利完成。

  • 要求的 I/O 作業已啟動,但在完成之前失敗。

  • 不支援要求的 I/O 作業,或在收到時無效,而且無法啟動。

  • 要求的 I/O 作業已取消。

如果驅動程式透過在裝置上建立 I/O 活動來服務 I/O 要求,驅動程式通常會從其EvtInterruptDpcEvtDpcFunc回呼函式呼叫WdfRequestComplete

如果驅動程式收到不支援或不正確要求,它通常會從接收要求的要求處理常式呼叫WdfRequestComplete

如果已取消I/O 作業,驅動程式通常會從其EvtRequestCancel回呼函式呼叫WdfRequestComplete

如果驅動程式將 I/O 要求 轉送I/O 目標,驅動程式會在 I/O 目標完成要求之後完成要求,如下所示:

  • 如果您的驅動程式同步將 I/ O 要求轉 送至 I/O 目標,則只有在較低層級驅動程式完成要求之後,驅動程式對 I/O 目標的呼叫才會傳回 (,除非發生錯誤) 。 I/O 目標傳回之後,您的驅動程式必須呼叫 WdfRequestComplete

  • 如果您的驅動程式以 非同步方式轉送 I/O 要求,您會希望驅動程式在較低層級的驅動程式完成要求時收到通知。 如果您的驅動程式註冊 CompletionRoutine 回呼函式,架構會在 I/O 目標完成要求之後呼叫此回呼函式。 CompletionRoutine回呼函式通常會呼叫WdfRequestComplete

若要註冊 CompletionRoutine 回呼函式,驅動程式必須先呼叫 WdfRequestSetCompletionRoutine ,才能將 I/O 要求轉送至 I/O 目標。

如果您的驅動程式不需要在 I/O 目標完成非同步轉送的 I/O 要求時收到通知,驅動程式就不需要註冊 CompletionRoutine 回呼函式。 相反地,驅動程式可以在呼叫WdfRequestSend時設定WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET旗標。 在此情況下,驅動程式不會呼叫 WdfRequestComplete

驅動程式未完成它藉由呼叫 WdfRequestCreateWdfRequestCreateFromIrp所建立的 I/O 要求。 相反地,驅動程式必須呼叫 WdfObjectDelete 來刪除要求物件,通常是在 I/O 目標完成要求之後。

例如,驅動程式可能會收到大於驅動程式 I/O 目標的資料量讀取或寫入要求,一次可以處理。 驅動程式必須將資料分割成數個較小的要求,並將這些較小的要求傳送至一或多個 I/O 目標。 處理這種情況的技術包括:

  • 呼叫 WdfRequestCreate 以建立代表較小要求的單一額外要求物件。

    驅動程式可以將此要求同步傳送至 I/O 目標。 較小的要求的 CompletionRoutine 回呼函式可以呼叫 WdfRequestReuse ,讓驅動程式可以重複使用要求,並將它再次傳送至 I/O 目標。 I/O 目標完成最後一個較小的要求之後, CompletionRoutine 回呼函式可以呼叫 WdfObjectDelete 來刪除驅動程式建立的要求物件,而驅動程式可以呼叫 WdfRequestComplete 來完成原始要求。

  • 呼叫 WdfRequestCreate 以建立數個代表較小要求的額外要求物件。

    驅動程式的 I/O 目標可以非同步處理這些多個較小的要求。 驅動程式可以為每個較小的要求註冊 CompletionRoutine 回呼函式。 每次呼叫 CompletionRoutine 回呼函式時,都可以呼叫 WdfObjectDelete 來刪除驅動程式建立的要求物件。 I/O 目標完成所有較小的要求之後,驅動程式可以呼叫 WdfRequestComplete 來完成原始要求。

提供完成資訊

當驅動程式完成要求時,可以選擇性地提供其他驅動程式可存取的一些額外資訊。 例如,驅動程式可能會提供針對讀取或寫入要求傳輸的位元組數目。 若要提供這項資訊,驅動程式可以執行下列其中一項:

取得完成資訊

若要取得另一個驅動程式已完成之 I/O 要求的相關資訊,驅動程式可以:

如果驅動程式以同步方式傳送 I/O 要求,它通常會在同步呼叫傳回之後呼叫 WdfRequestGetStatusWdfRequestGetCompletionParamsWdfRequestGetInformation 。 如果驅動程式以非同步方式傳送 I/O 要求,它通常會從 CompletionRoutine 回呼函式內呼叫這些方法。

如需完成 I/O 要求的詳細資訊,請參閱 同步處理取消和完成程式碼