使用緩衝 I/O 的 DispatchReadWrite

任何設定其裝置物件以進行緩衝處理 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 堆疊位置中的參數有效性。