共用方式為


使用直接 I/O 的 DispatchReadWrite

任何設定其裝置物件以進行直接 I/O 的較低層級設備磁碟機,會藉由將從裝置傳輸的資料傳回至系統實體記憶體來滿足讀取要求,如 Irp-MdlAddress > 上的 MDL所述。 它會藉由將資料從系統實體記憶體傳送到其裝置,以滿足寫入要求。

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

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

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

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

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

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