共用方式為


DispatchReadWrite 使用緩衝 I/O

任何設定緩衝 I/O 裝置物件的最低層級裝置驅動程式都會將從其裝置傳輸的資料傳回至 Irp-AssociatedIrp.SystemBuffer> 的鎖定系統空間緩衝區,以滿足讀取要求。 它透過將資料從相同的緩衝區傳輸到其裝置來滿足寫入要求。

因此,這類裝置驅動程式的 DispatchReadWrite 常式通常會在收到傳輸要求時執行下列動作:

  1. 呼叫 IoGetCurrentIrpStackLocation 並判斷傳輸要求的方向。

  2. 檢查請求參數的有效性。

    • 針對讀取要求,常式通常會檢查驅動程式的 IoStackLocation-Parameters.Read.Length> 值,以判斷緩衝區是否足夠大,以接收從裝置傳輸的數據。

      例如,系統鍵盤類別驅動程式會處理僅來自 Win32 使用者輸入執行緒的讀取要求。 此驅動程式會定義結構 KEYBOARD_INPUT_DATA,以儲存裝置的按鍵,並在任何指定時刻將其中一些結構保留在內部環形緩衝區中,以滿足讀取要求進入時的需求。

    • 針對寫入要求,常式通常會檢查 Parameters.Write.Length 的值,並視需要檢查 Irp-AssociatedIrp.SystemBuffer> 的資料有效性:也就是說,如果其裝置只接受包含具有定義值範圍之成員的結構化數據封包。

  3. 如果任何參數無效, DispatchReadWrite 常式會立即完成 IRP,如 完成 IRP 中所述。 否則,常式會傳遞 IRP,以供其他驅動程式常式進一步處理,如將 IRP 向下傳遞驅動程式堆疊中所述。

使用緩衝 I/O 的最低層級裝置驅動程式通常必須讀取或寫入要求起始者所指定大小的數據,以滿足傳輸要求。 這類驅動程式可能會定義從其裝置傳入或傳送至其裝置之數據的結構,而且可能會在內部緩衝結構化數據,就像系統鍵盤類別驅動程式一樣。

在內部緩衝數據的驅動程式應該支援 IRP_MJ_FLUSH_BUFFERS 要求,而且也可以支援 IRP_MJ_SHUTDOWN 要求。

鏈結中最高層級的驅動程式通常負責檢查輸入 IRP 的參數,再將讀取/寫入要求傳遞至較低的驅動程式。 因此,許多較低層級的驅動程式可以假設其讀取/寫入 IRP 中的 I/O 堆疊位置具有有效的參數。 如果鏈結中最底層的驅動程式了解有關資料傳輸的裝置特定限制,則該驅動程式需要檢查其 I/O 堆疊位置中的參數是否有效。