正在完成 I/O 要求
每個架構型驅動程式最終都必須完成它從架構接收的每個 I/O 要求。 驅動程式會呼叫要求物件的 WdfRequestComplete、 WdfRequestCompleteWithInformation或 WdfRequestCompleteWithPriorityBoost 方法來完成要求。
完成要求的時機
驅動程式在判斷下列其中一個案例成立時,必須完成要求:
要求的 I/O 作業已順利完成。
要求的 I/O 作業已啟動,但在完成之前失敗。
不支援要求的 I/O 作業,或在收到時無效,而且無法啟動。
要求的 I/O 作業已取消。
如果驅動程式透過在裝置上建立 I/O 活動來服務 I/O 要求,驅動程式通常會從其EvtInterruptDpc或EvtDpcFunc回呼函式呼叫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。
驅動程式未完成它藉由呼叫 WdfRequestCreate 或 WdfRequestCreateFromIrp所建立的 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 要求的相關資訊,驅動程式可以:
呼叫 WdfRequestGetStatus 以取得在呼叫 WdfRequestComplete時所指定的較低層級驅動程式完成狀態值。
呼叫 WdfRequestGetCompletionParams 以取得包含已完成要求的其他資訊 WDF_REQUEST_COMPLETION_PARAMS 結構,例如代表要求緩衝區的記憶體物件控制碼,或匯流排特定資訊。
驅動程式只能在呼叫WdfRequestSend之後呼叫WdfRequestCompletionParams,以同步或非同步方式將 I/O 要求傳送至 I/O 目標。 驅動程式在呼叫其中一個將 I/O 要求傳送至 I/O 目標的方法時,不得呼叫 WdfRequestGetCompletionParams ,只以同步方式 (,例如 WdfIoTargetSendReadSynchronously) 。
如果驅動程式堆疊中的驅動程式提供這類資訊,請呼叫WdfRequestSetInformation或WdfRequestCompleteWithInformation時,呼叫WdfRequestGetInformation以取得較低層級驅動程式所指定的其他 I/O 完成資訊。
如果驅動程式以同步方式傳送 I/O 要求,它通常會在同步呼叫傳回之後呼叫 WdfRequestGetStatus、 WdfRequestGetCompletionParams和 WdfRequestGetInformation 。 如果驅動程式以非同步方式傳送 I/O 要求,它通常會從 CompletionRoutine 回呼函式內呼叫這些方法。
如需完成 I/O 要求的詳細資訊,請參閱 同步處理取消和完成程式碼。