IRP_MJ_WRITE (FS 和筛选器驱动程序)
发送时间
I/O 管理器或文件系统驱动程序发送IRP_MJ_WRITE请求。 例如,当用户模式应用程序调用 Win32 函数(如 WriteFile )或内核模式组件调用 ZwWriteFile 时,可以发送此请求。
操作:文件系统驱动程序
文件系统驱动程序应提取和解码文件对象以确定参数和次要函数代码。
对于 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) 中包含的 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 结构,该结构接收最终完成状态和有关所请求操作的信息。 如果IRP_MJ_WRITE请求失败,则文件系统的写入调度例程将返回错误 NTSTATUS 值,并且 Irp-IoStatus.Information> 的值未定义,不应使用。
Irp->MdlAddress 是内存描述符列表 (MDL) 的地址,用于描述要向其写入数据的页面。
IrpSp->FileObject 指向与 DeviceObject 关联的文件对象。 如果在 IrpSp-FileObject-Flags>> 中设置了FO_SYNCHRONOUS_IO标志,则表示已为同步 I/O 打开文件对象。
IrpSp-FileObject> 参数包含指向 RelatedFileObject 字段的指针,该字段也是FILE_OBJECT结构。 FILE_OBJECT 结构的 RelatedFileObject 字段在处理IRP_MJ_WRITE期间无效,不应使用。
IrpSp->标志:如果设置了SL_FORCE_DIRECT_WRITE标志,内核模式驱动程序可以写入由于直接写入阻塞而通常无法写入的卷区域。 直接写入阻止是在 Windows Vista 和更高版本的操作系统中出于安全原因实现的。 在文件系统层和存储堆栈层都检查此标志。 有关直接写入阻止的详细信息,请参阅 阻止对卷和磁盘的直接写入操作。 SL_FORCE_DIRECT_WRITE标志在 Windows Vista 和更高版本的 Windows 中可用。
IrpSp->MajorFunction 设置为 IRP_MJ_WRITE。
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.Write.ByteOffset 是一个LARGE_INTEGER变量,用于指定要写入的数据的文件中的起始字节偏移量。
在某些情况下,此参数可能包含特殊值。 例如,如果为 true,则以下条件指示应使用文件的当前末尾而不是显式文件偏移值:IrpSp-Parameters.Write.ByteOffset.LowPart> == FILE_WRITE_TO_END_OF_FILE 和 IrpSp-Parameters.Write.ByteOffset.HighPart> == -1
IrpSp->Parameters.Write.Key 是与目标文件上的字节范围锁关联的键值。
IrpSp->Parameters.Write.Length 是要写入的数据的长度(以字节为单位)。 如果写入操作成功,则 Irp-IoStatus> 指向的 IO_STATUS_BLOCK 结构的 Information 成员中返回写入的字节数。
注解
文件系统将文件末尾的写入和读取操作舍入到基础文件存储设备扇区大小的倍数。 当筛选器处理预读取或预写入操作时,分配和交换缓冲区的筛选器需要将分配的缓冲区的大小舍入到关联设备的扇区大小的倍数。 否则,从基础文件系统传输的数据的长度将超过分配的缓冲区长度。 有关交换缓冲区的详细信息,请参阅 swapBuffers 微筛选器示例。
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈