讀取/寫入分派常式的摘要
實作DispatchRead、DispatchWrite 或 DispatchReadWrite常式時,請記住下列幾點:
在 IRP 中設定下一個較低層級驅動程式的 I/O 堆疊位置之前,必須負責在多層式驅動程式鏈結中檢查傳入讀取/寫入 IRP 的參數是否有效。
中繼和最低層級驅動程式通常可以依賴其鏈結中的最高層級驅動程式,以傳遞具有有效參數的傳輸要求。 不過,任何驅動程式都可以在其 IRP 的 I/O 堆疊位置的參數上執行健全性檢查,而且每個設備磁碟機都應該檢查參數是否有可能違反其裝置所加加之任何限制的條件。
如果DispatchReadWrite常式完成發生錯誤的 IRP,它應該使用適當的 NTSTATUS 類型值來設定 I/O 堆疊位置狀態成員、將Information成員設定為零,並使用 IRP 和priorityBoost呼叫IoCompleteRequest IO_NO_INCREMENT。
如果驅動程式使用緩衝的 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 一起傳遞它,取決於驅動程式的設計及其下階層式驅動程式。
不過,如果IoCallDriver配置任何資源,則較高層級的驅動程式必須先呼叫IoSetCompletionRoutine,例如 IRP 或記憶體。 當較低的驅動程式已完成要求,但在IoCompletion常式使用原始 IRP 呼叫IoCompleteRequest之前,其IoCompletion常式必須釋放任何驅動程式配置的資源。
如果較高層級的驅動程式為可能包含基礎卸載式媒體設備磁碟機的較低驅動程式配置 IRP,則配置驅動程式必須在配置的每個 IRP 中建立執行緒內容。