较高级驱动程序中的 DispatchReadWrite

除了文件系统驱动程序,更高级别的驱动程序通常没有 IRP 的任何内部驱动程序队列。 此类驱动程序的 DispatchReadWrite 例程可以将具有有效参数的 IRP 传递到较低驱动程序,可能是在设置 IoCompletion 例程后,如在 驱动程序堆栈向下传递 IRP 中所述。

但是,SCSI 类驱动程序的 DispatchReadWrite 例程负责在向 SCSI 端口/微型端口驱动程序对发送带有主要功能代码 IRP_MJ_READIRP_MJ_WRITE 的 IRP 之前,必要时拆分大型传输请求。 有关详细信息,请参阅 存储类驱动程序的 SplitTransferRequest 例程

如果较高级别的驱动程序分配一个或多个 IRP(它为其 DispatchReadWrite 例程中的下一个较低驱动程序设置)以请求若干部分传输,则 DispatchReadWrite 例程必须为每个驱动程序分配的 IRP 调用 IoSetCompletionRoutine 。 驱动程序必须注册其 IoCompletion 例程,以跟踪数据在每个部分传输操作中的传输量,这样 IoCompletion 例程可以释放所有由驱动程序分配的 IRP,并最终完成原始请求。

如果基础驱动程序控制可移动媒体设备,则由高级驱动程序分配的任何 IRP 都必须具有线程上下文。 为了设置线程上下文,分配驱动程序必须在每个新分配的 IRP 中设置 Irp-Tail.Overlay.Thread,并将其值来源于传入的传输 IRP。 有关详细信息,请参阅 支持可移动媒体

如果基础设备驱动程序在进行部分传输时返回一个错误的 IRP,则 IoCompletion 例程可以重试部分传输请求,或者在释放上层驱动程序分配的所有 IRP 和内存后,使用返回的错误设置原始 IRP 的 I/O 状态块来完成其请求。

如果高级驱动程序的 DispatchReadWrite 例程为部分传输操作而分配内存,并且其分配的内存将被驱动程序的 IoCompletion 例程(或基础设备驱动程序)访问,那么 DispatchReadWrite 例程必须从非分页池中分配该内存。