IRP_MJ_READ(FS 和筛选器驱动程序)
发送时间
I/O 管理器或文件系统驱动程序发送 IRP_MJ_READ 请求。 例如,当用户模式应用程序调用 Win32 函数(例如,ReadFile)或内核模式组件调用 ZwReadFile 时,可以发送此请求。
操作:文件系统驱动程序
文件系统驱动程序应提取和解码文件对象,以确定参数和次要函数代码。
对于内存描述符列表 (MDL) 读取请求,文件系统会检查次要函数代码来确定请求的操作。 以下是有效的次要函数代码,只能用于缓存的文件 I/O:
- IRP_MN_COMPLETE
- IRP_MN_COMPLETE_MDL
- IRP_MN_COMPLETE_MDL_DPC
- IRP_MN_COMPRESSED
- IRP_MN_DPC
- IRP_MN_MDL
- IRP_MN_MDL_DPC
- IRP_MN_NORMAL
有关处理此 IRP 的详细信息,请研究 Windows 驱动程序工具包 (WDK) 中包含的 CDFS 和 FASTFAT 示例。
操作:旧版文件系统筛选器驱动程序
筛选器驱动程序应执行任何所需的处理,并根据筛选器的性质执行下列操作之一:
- IRP 完成或失败,或
- 将 IRP 向下传递到堆栈上的下一个较低驱动程序。
参数
对于给定的 IRP,文件系统或筛选器驱动程序调用 IoGetCurrentIrpStackLocation,以获取指向 IRP 中其自身堆栈位置的指针。 在以下参数中,Irp 指向 IRP,IrpSp 指向 IO_STACK_LOCATION。 驱动程序可以使用在以下 IRP 成员和 IRP 堆栈位置中设置的信息来处理读取请求:
DeviceObject 是指向目标设备对象的指针。
如果 DeviceObject->Flags 中设置了 DO_BUFFERED_IO 标志,则 Irp->AssociatedIrp.SystemBuffer 指向用作中间系统缓冲区的系统提供的缓冲区。 否则,此成员设置为 NULL。
Irp->IoStatus 指向一个 IO_STATUS_BLOCK 结构,该结构接收最终完成状态和有关请求操作的信息。 有关详细信息,请参阅 ZwReadFile 的 IoStatusBlock 参数的说明。
Irp->MdlAddress 是内存描述符列表 (MDL) 的地址,描述包含要读取的数据的页面。
Irp->UserBuffer 指向调用方提供的输出缓冲区,该缓冲区接收从文件读取的数据。
IrpSp->FileObject 指向与 DeviceObject 关联的文件对象。 如果在 IrpSp->FileObject->Flags 中设置了 FO_SYNCHRONOUS_IO 标志,则会为同步 I/O 打开文件对象。
IrpSp->FileObject 参数包含指向 RelatedFileObject 字段的指针,该字段也是 FILE_OBJECT 结构。 FILE_OBJECT 结构的 RelatedFileObject 字段在处理 IRP_MJ_READ 期间无效,不应使用。
IrpSp->MajorFunction 设置为 IRP_MJ_READ。
IrpSp->MinorFunction 指定要请求的操作,并包含以下值之一。 如果未指定次要函数代码,则操作是标准读取(等效于 IRP_MN_NORMAL)。
MinorFunction 说明 IRP_MN_NORMAL 读取请求适用于标准读取操作 IRP_MN_DPC 读取请求来自 DPC 例程 IRP_MN_MDL 返回一个 MDL,描述 Irp->MdlAddress 中文件的缓存数据;调用方使用此 MDL 直接从缓存读取数据 IRP_MN_COMPLETE 指示标准读取操作完成 IRP_MN_COMPRESSED 读取请求适用于压缩文件 IRP_MN_MDL_DPC 读取请求来自 DPC 例程,并返回一个 MDL,描述 Irp->MdlAddress 中文件的缓存数据 IRP_MN_COMPLETE_MDL 指示使用 MDL 直接从缓存读取数据的调用方已完成使用 MDL IRP_MN_COMPLETE_MDL_DPC 指示使用 MDL 直接从缓存读取数据的调用方已完成使用 MDL;读取请求来自 DPC 例程 IrpSp->Parameters.Read.ByteOffset 是一个 LARGE_INTEGER 变量,指定要读取的数据文件中的起始字节偏移量。
IrpSp->Parameters.Read.Key 是与目标文件上的字节范围锁定相关联的键值。
IrpSp->Parameters.Read.Length 是要读取的数据的长度(以字节为单位)。 如果读取操作成功,则读取的字节数将返回到 Irp->IoStatus 所指向的 IO_STATUS_BLOCK 结构的 Information 成员中。
注解
文件系统将文件末尾的写入和读取操作舍入到基础文件存储设备的多个扇区大小。 当筛选器处理预读取或预写入操作时,分配和交换缓冲区的筛选器需要将分配的缓冲区的大小舍入到关联设备的扇区大小的倍数。 否则,从基础文件系统传输的数据长度将超过缓冲区的分配长度。 有关交换缓冲区的详细信息,请参阅交换缓冲区微型筛选器示例。