轉送 I/O 要求

當驅動程式收到無法處理的 I/O 要求時,通常會執行下列其中一項:

  • 它會將收到的要求轉送給另一個驅動程式。

  • 它會建立其他要求,並將其傳送至另一個驅動程式。

架構型驅動程式 會使用 I/O 目標轉送要求,這代表系統上的其他驅動程式。 驅動程式可以使用下列任何技術,將要求轉送至 I/O 目標:

  • 驅動程式可以藉由呼叫 WdfDeviceGetIoTarget,後面接著 WdfRequestFormatRequestUsingCurrentType,最後呼叫 WdfRequestSend,將 I/O 要求轉送至下一個較低的驅動程式。

    只有在驅動程式收到在轉送之前不需要修改的要求時,這項技術才有用。

  • 驅動程式可以呼叫 WdfFdoInitSetFilter ,將本身註冊為篩選驅動程式。

    如果篩選驅動程式未針對特定類型的 I/O 要求提供 I/O 佇列,架構會自動將該類型的要求轉送至下一個較低的驅動程式。

  • 一般而言,函式驅動程式會檢查每個 I/O 要求的內容。 如果函式驅動程式無法處理要求,它可能會修改要求,並將它轉送至 I/O 目標。 或者,它可能會建立一或多個新要求,並將其傳送至 I/O 目標。

    架構的 I/O 目標物件會定義數種方法,以將 I/O 要求傳送至其他驅動程式。 例如,驅動程式可以呼叫 WdfIoTargetFormatRequestForRead,後面接著 WdfRequestSend,將讀取要求傳送至 I/O 目標。 如需 I/O 目標的詳細資訊,請參閱 使用 I/O 目標

    很少,驅動程式寫入器可能會想要指定要求基礎 WDM I/O 堆疊位置 的內容,然後再將要求傳送至 I/O 目標。 在這些情況下,驅動程式可以在呼叫WdfRequestSend之前呼叫WdfRequestWdmFormatUsingStackLocation

有時候,驅動程式必須將相同的要求傳送至數個 I/O 目標,通常是因為驅動程式必須將單一命令傳送至其所有裝置。 將要求傳送至 I/O 目標之前,驅動程式可以呼叫 WdfRequestChangeTarget 以確認 I/O 目標可存取。

驅動程式最終必須完成它轉送至 I/O 目標的每個要求,除非在呼叫WdfRequestSend時設定WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET旗標。

請注意,當驅動程式轉送要求時,架構不會將架構要求物件從傳送驅動程式傳送至接收驅動程式。 相反地,架構會在驅動程式中建立新的要求物件,以接收要求。 只有要求的基礎 I/O 要求封包 (IRP) 會從一個驅動程式傳輸到另一個驅動程式。