共用方式為


使用直接 I/O 的 DispatchReadWrite

任何設定其裝置物件以進行直接 I/O 的較低層級裝置驅動程式都會藉由傳回從其裝置傳輸至系統實體記憶體的數據來滿足讀取要求,這由 Irp-MdlAddress> 的 MDL 描述。 它透過將資料從系統實體記憶體傳輸到其裝置來滿足寫入要求。

較低層級的驅動程式必須以非同步方式處理讀取/寫入要求。 因此,每個較低層級驅動程式的 DispatchReadWrite 常式都必須將 IRP_MJ_READ 傳遞,並將具有有效參數的 IRP IRP_MJ_WRITE 傳遞至其他驅動程式常式,如將 IRP 向下傳遞驅動程式堆疊中所述。

針對傳送至較低層級驅動程式的讀取/寫入 IRP,Irp-MdlAddress> 所描述的分頁實體記憶體已被鏈結中的最高層級驅動程式或 I/O 管理員鎖定,並已探查以確認是否具有進行請求的傳輸所需的正確存取權限。 任何設定其裝置物件以進行直接 I/O 的中繼或最低層級驅動程式都不應該呼叫 MmProbeAndLockPages ,因為這已經完成。 最低層級的驅動程式會呼叫 MmGetSystemAddressForMdlSafe。 (Windows 98 的驅動程式會改為呼叫 MmGetSystemAddressForMdl 。Windows Me、Windows 2000 和更新版本 Windows 的驅動程式應該使用 MmGetSystemAddressForMdlSafe

如果無法信任較高層級的驅動程式只傳遞具有有效參數的 IRP,任何中繼或最低層級裝置驅動程式的 DispatchReadWrite 常式都應該驗證其讀取/寫入 IRP 的 I/O 堆疊位置中的參數。 如果 DispatchReadWrite 常式發現參數錯誤,它應該使用適當的錯誤 STATUS_XXX 值來完成 IRP,如完成 IRP 中所述。 如果參數有效,中繼驅動程式的 DispatchReadWrite 常式必須根據 Higher-Level 驅動程式中 DispatchReadWrite 中的指導方針,傳遞要求以進行進一步處理。

最低層級裝置驅動程式的 DispatchReadWrite 常式必須呼叫 IoMarkIrpPending 並提出傳輸要求、傳遞 IRP 以供其他驅動程式常式進一步處理,並傳回STATUS_PENDING,如將 IRP 向下傳遞驅動程式堆疊中所述。

請注意,裝置驅動程式的 DispatchReadWrite 常式可以使用驅動程式決定的 Key 值呼叫 IoStartPacket,以控制 IRP 排入其裝置佇列的順序,以加快 I/O 輸送量。 驅動程式中的另一個常式稍後會將 IRP 取消佇列,判斷要求的長度是否必須分割成部分傳輸作業,並設定裝置以進行數據傳輸。

一般而言,必須分割大型傳輸要求以符合其裝置限制的裝置驅動程式,應該將這些作業延後到為指定的傳輸要求設定裝置之前。 這類裝置驅動程式的 DispatchReadWrite 常式不應該檢查傳入 IRP 的 I/O 堆疊位置,以取得任何裝置特定的傳輸條件約束,也不應嘗試計算部分傳輸範圍,當驅動程式可以將這些檢查延後到其 StartIo (或其他驅動程式常式) 對裝置進行傳輸作業程式設計之前。