Higher-Level Drivers 中的 DispatchReadWrite
除了檔案系統驅動程式之外,較高層級的驅動程式通常沒有任何適用于 IRP 的內部驅動程式佇列。 這類驅動程式的 DispatchReadWrite 常式可以將具有有效參數的 IRP 傳遞至較低的驅動程式,可能是在設定 IoCompletion 常式之後,如 將 IRP 傳遞至驅動程式堆疊中所述。
不過,SCSI 類別驅動程式的 DispatchReadWrite 常式會負責視需要分割大型傳輸要求,再將具有主要函式程式碼的 IRP 傳送IRP_MJ_READ 或 IRP_MJ_WRITE 到 SCSI 埠/迷你埠驅動程式配對。 如需詳細資訊,請參閱 儲存體類別驅動程式的 SplitTransferRequest 常式。
如果較高層級的驅動程式配置一或多個 IRP,它會針對 其 DispatchReadWrite 常式中的下一個較低驅動程式設定,以要求一些部分傳輸, DispatchReadWrite 常式必須為每個驅動程式配置的 IRP 呼叫 IoSetCompletionRoutine 。 驅動程式必須註冊其 IoCompletion 常式,以追蹤每個部分傳輸作業中傳輸的資料量,讓 IoCompletion 常式可以釋放所有驅動程式配置的 IRP,最後完成原始要求。
如果基礎驅動程式控制抽取式媒體裝置,則由較高層級驅動程式配置的任何 IRP 都必須具有線程內容。 若要設定執行緒內容,配置驅動程式必須設定 Irp-Tail.Overlay >。每個新配置的 IRP 中的執行緒,都來自傳入傳輸 IRP 中的相同值。 如需詳細資訊,請參閱 支援卸載式媒體。
如果基礎設備磁碟機針對部分傳輸傳回 IRP 併發生錯誤, IoCompletion 常式可以重試部分傳輸要求,或完成原始 IRP,並將其 I/O 狀態欄塊設定為傳回的錯誤,並在釋放任何 IRP 和記憶體之後,配置較高層級的驅動程式。
如果較高層級的驅動程式 DispatchReadWrite 常式配置部分傳輸作業的記憶體,而且驅動程式的 IoCompletion 常式會存取其配置 (或基礎設備磁碟機) , DispatchReadWrite 常式必須從非分頁集區配置該記憶體。