IRP_MJ_READ
将数据从其设备传输到系统的每个设备驱动程序都必须处理 DispatchRead 或 DispatchReadWrite 例程中的读取请求,与在此类设备驱动程序上分层的任何更高级别的驱动程序一样。
发送时间
创建请求成功完成后的任何时间。
用户模式应用程序或 Win32 组件具有表示目标设备对象的文件对象的句柄,可能已请求从设备传输数据。 可能,更高级别的驱动程序已创建并设置读取 IRP。
输入参数
驱动程序在 IRP 中的 I/O 堆栈位置指示在 Parameters.Read.Length 处传输的字节数。
某些驱动程序使用 Parameters.Read.Key 中的值将传入读取请求排序为设备队列或驱动程序管理的 IRP 内部队列中由驱动程序确定的顺序。
某些类型的驱动程序还使用 Parameters.Read.ByteOffset 中的值,该值指示传输操作的起始偏移量。 有关示例,请参阅可安装文件系统 ( IFS) 文档中的 IRP_MJ_READ 主题。
输出参数
根据基础设备驱动程序是使用DO_BUFFERED_IO还是DO_DIRECT_IO设置目标设备对象的 标志 ,数据将传输到以下其中一个:
如果驱动程序使用缓冲 I/O,则为 Irp-AssociatedIrp.SystemBuffer> 处 的缓冲区。
如果基础设备驱动程序使用直接 I/O (DMA 或 PIO) ,则为 Irp-MdlAddress> 处的 MDL 描述的缓冲区。
Operation
收到读取请求后,较高级别的驱动程序会在 IRP 中为下一个较低级别的驱动程序设置 I/O 堆栈位置,或者为一个或多个较低级别的驱动程序创建并设置其他 IRP。 它可以通过调用 IoSetCompletionRoutine 来设置其 IoCompletion 例程,该例程对于输入 IRP 是可选的,但对于驱动程序创建的 IRP 是必需的。 然后,驱动程序使用 IoCallDriver 将请求传递给下一个较低的驱动程序。
收到读取请求后,设备驱动程序会将数据从其设备传输到系统内存。 设备驱动程序将 I/O 状态块的 “信息 ”字段设置为完成 IRP 时传输的字节数。
要求
标头 |
Wdm.h(包括 Wdm.h、Ntddk.h 或 Ntifs.h) |