存储类驱动程序的 RetryRequest 例程
如果发生涉及在总线上传输数据的设备错误(包括总线奇偶校验错误、选择超时和目标/控制器忙错误),基础存储端口驱动程序负责重试请求。 如果重试失败,存储端口驱动程序会以适当的错误完成请求,并记录 I/O 错误。
存储类驱动程序绝不应尝试重试端口驱动程序已由于上述任何错误而失败的请求。
存储类驱动程序负责重试因设备特定的错误、目标/控制器繁忙以外的目标/控制器错误、总线重置或请求超时而失败的请求。 通常, RetryRequest 例程可以将此类 IRP 重新提交到下一个较低的驱动程序,并指示将 SRB 置于端口驱动程序的特定于 LU 的队列的头。
具体而言, RetryRequest 例程应执行以下操作:
确保部分传输请求为起始地址和长度设置了正确的值。
零 SRB 的 SrbStatus 和 ScsiStatus 成员。
根据需要为设备设置 SrbFlags 成员。
按照 存储类驱动程序的 Dispatch 例程通过存储类驱动程序 的 SplitTransferRequest 例程中所述,在 IRP 中设置端口驱动程序的 I/O 堆栈位置。
调用 IRP 的 IoSetCompletionRoutine ,因为驱动程序的 IoCompletion 例程必须在 IRP 返回之前释放 SRB。 IoCompletion 例程可能还需要多次重试请求,或者调用驱动程序的 InterpretRequestSense 或 ReleaseQueue 例程。
使用 IoCallDriver 将请求传递到下一个较低的驱动程序。