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 是指向目标设备对象的指针。
Irp->如果在 DeviceObject-Flags> 中设置了DO_BUFFERED_IO标志,则 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_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
IrpSp->Parameters.Read.ByteOffset 是一个LARGE_INTEGER变量,用于指定要读取的数据的文件中的起始字节偏移量。
IrpSp->Parameters.Read.Key是与目标文件上的字节范围锁关联的键值。
IrpSp->Parameters.Read.Length 是要读取的数据的长度(以字节为单位)。 如果读取操作成功,则 Irp-IoStatus> 指向的 IO_STATUS_BLOCK 结构的 Information 成员中返回读取的字节数。
注解
文件系统将文件末尾的写入和读取操作舍入到基础文件存储设备扇区大小的倍数。 当筛选器处理预读取或预写入操作时,分配和交换缓冲区的筛选器需要将分配的缓冲区的大小舍入到关联设备的扇区大小的倍数。 否则,从基础文件系统传输的数据的长度将超过分配的缓冲区长度。 有关交换缓冲区的详细信息,请参阅 swapBuffers 微筛选器示例。
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈