较高级驱动程序中的 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 例程必须从非分页池中分配该内存。