實作 DispatchRead、 DispatchWrite 或 DispatchReadWrite 常式時,請記住下列幾點:
分層驅動程式鏈結中最高層級的驅動程式負責檢查傳入讀取/寫入 IRP 的參數是否有效,再在 IRP 中設定下一個較低層級驅動程式的 I/O 堆疊位置。
中級和最低級別驅動程序通常可以依賴其鏈條中最高級別的驅動程序來傳遞具有有效參數的傳輸請求。 不過,任何驅動程式都可以對其 IRP 的 I/O 堆疊位置中的參數執行健全性檢查,而每個裝置驅動程式都應該檢查這些參數,以尋找任何可能違反該裝置所施加限制的條件。
如果 DispatchReadWrite 常式完成 IRP 並發生錯誤,它應該使用適當的 NTSTATUS 類型值來設定 I/O 堆疊位置 Status 成員、 將 Information 成員設定為零,並使用 IRP 呼叫 IoCompleteRequest 和 IO_NO_INCREMENT 的 PriorityBoost 。
如果驅動程式使用緩衝的 I/O,它可能需要定義結構來包含要傳輸的數據,而且可能需要在內部緩衝一些這些結構。
如果驅動程式使用直接 I/O,它可能需要檢查 Irp-MdlAddress> 的 MDL 是否描述了緩衝區,其中包含過多的資料(或過多的分頁),這可能會導致基礎裝置無法在單一傳輸作業中處理。 如果是,驅動程式必須將原始傳輸要求分割成一系列較小的傳輸作業。
緊密結合的類別驅動程式可能會在其基礎埠驅動程式的 DispatchReadWrite 常式中分割這類要求。 需要 SCSI 類別驅動程式,特別是對於大容量儲存裝置,才能執行此動作。 如需 SCSI 驅動程式需求的詳細資訊,請參閱 儲存體驅動程式。
較低層級裝置驅動程式的 DispatchReadWrite 常式應該延後將大型傳輸要求分割成部分傳輸,直到另一個驅動程式常式將 IRP 從佇列中移除以設定裝置進行傳輸。
如果較低層級的裝置驅動程式將讀取/寫入 IRP 排入佇列,以便由自己的常式進一步處理,則必須先呼叫 IoMarkIrpPending 才能將 IRP 排入佇列。 在這些情況下, DispatchReadWrite 常式也必須傳回具有 STATUS_PENDING 的控制權。
如果 DispatchReadWrite 常式將 IRP 傳遞至較低的驅動程式,它必須為 IRP 中下一個較低的驅動程式設定 I/O 堆疊位置。 較高層級的驅動程式是否也會在 IRP 中設定 IoCompletion 常式,再使用 IoCallDriver 傳遞它,取決於驅動程式的設計,以及分層在其底下的驅動程式。
不過,如果較高層級的驅動程式配置任何資源,例如 IRP 或記憶體,則必須先呼叫 IoSetCompletionRoutine ,才能呼叫 IoCallDriver 。 當較低的驅動程式完成要求時,其 IoCompletion 常式必須釋放任何驅動程式配置的資源,但在 IoCompletion 常式使用原始 IRP 呼叫 IoCompleteRequest 之前。
如果較高層級的驅動程式會針對可能包含基礎卸除式媒體裝置驅動程式的較低驅動程式配置 IRP,則配置驅動程式必須在配置的每個 IRP 中建立執行緒內容。