IRP_MJ_FILE_SYSTEM_CONTROL (FS 和筛选器驱动程序)
发送时间
I/O 管理器、其他操作系统组件和其他内核模式驱动程序发送IRP_MJ_FILE_SYSTEM_CONTROL请求。 例如,当用户模式应用程序调用 Win32 DeviceIoControl 函数以 (FSCTL) 请求发送文件系统 I/O 控件时,可以发送它。
操作:文件系统驱动程序
文件系统驱动程序或识别器应检查次要函数代码,以确定请求的文件系统控制操作。
文件系统驱动程序应处理以下次要函数代码:
代码 | 说明 |
---|---|
IRP_MN_KERNEL_CALL | 此请求与) 中描述的IRP_MN_USER_FS_REQUEST (相同,只不过请求的源是受信任的内核组件。 |
IRP_MN_MOUNT_VOLUME | 指示卷装载请求。 如果文件系统驱动程序收到其格式与文件系统的格式不匹配的卷的此 IRP,则文件系统驱动程序应返回STATUS_UNRECOGNIZED_VOLUME。 |
IRP_MN_USER_FS_REQUEST | 指示 FSCTL 请求,可能代表已调用 Microsoft Win32 DeviceIoControl 函数的用户模式应用程序,或代表已调用 ZwDeviceIoControlFile 或 IoBuildDeviceIoControlRequest 的内核模式组件。 有关 FSCTL 请求的详细信息,请参阅 Windows SDK 文档中的“设备输入和输出控制代码”。 |
IRP_MN_VERIFY_VOLUME | 指示卷验证请求。 对于可移动媒体,文件系统必须在检测到媒体已被移除并返回时验证卷,以确保它仍然是同一已知卷。 如果卷已更改,文件系统应使所有未完成的句柄失效。 如果此新媒体上的文件系统已更改,则它还应返回错误。 此请求最常用于软盘驱动器。 |
文件系统识别器必须处理以下次要函数代码:
代码 | 说明 |
---|---|
IRP_MN_LOAD_FILE_SYSTEM | 指示加载文件系统请求。 |
文件系统驱动程序或识别器应执行请求的操作,然后完成 IRP。
操作:旧版文件系统筛选器驱动程序
筛选器驱动程序应将此 IRP 向下传递到堆栈上下一个较低的驱动程序。
参数
文件系统或筛选器驱动程序调用给定 IRP 的 IoGetCurrentIrpStackLocation ,以获取指向 IRP 中其自身堆栈位置的指针。 在以下参数中, Irp 指向 IRP , 而 IrpSp 指向 IO_STACK_LOCATION。 驱动程序可以使用 IRP 和 IRP 堆栈位置的以下成员中设置的信息来处理文件系统控制请求:
DeviceObject 是指向目标设备对象的指针。
Irp->AssociatedIrp.SystemBuffer 指向系统提供的输入缓冲区,该缓冲区将传递给目标卷的文件系统或文件系统筛选器驱动程序。 用于METHOD_BUFFERED或METHOD_DIRECT I/O。 是否需要此参数取决于特定的文件系统控制代码。
Irp->IoStatus 指向一个 IO_STATUS_BLOCK 结构,该结构接收最终完成状态和有关所请求操作的信息。
Irp->MdlAddress 是内存描述符列表的地址, (MDL) 描述要传递给目标卷的文件系统或文件系统筛选器驱动程序的输出缓冲区。 用于METHOD_DIRECT I/O。 是否需要此参数取决于特定的 I/O 控制代码。
Irp->UserBuffer 指向调用方提供的输出缓冲区,该缓冲区将传递给目标卷的文件系统或文件系统筛选器驱动程序。 用于METHOD_BUFFERED或METHOD_NEITHER I/O。 此参数是可选的还是必需的取决于特定的 I/O 控制代码。
IrpSp->FileObject 指向与 DeviceObject 关联的文件对象。
IrpSp-FileObject> 参数包含指向 RelatedFileObject 字段的指针,该字段也是FILE_OBJECT结构。 FILE_OBJECT 结构的 RelatedFileObject 字段在处理IRP_MJ_FILE_SYSTEM_CONTROL期间无效,不应使用。
IrpSp->标志可以 设置为IRP_MN_VERIFY_VOLUME SL_ALLOW_RAW_MOUNT。
IrpSp->MajorFunction 设置为 IRP_MJ_FILE_SYSTEM_CONTROL。
IrpSp->MinorFunction 可以设置为以下值之一。
- IRP_MN_KERNEL_CALL
- IRP_MN_LOAD_FILE_SYSTEM
- IRP_MN_MOUNT_VOLUME
- IRP_MN_USER_FS_REQUEST
- IRP_MN_VERIFY_VOLUME
IrpSp->Parameters.FileSystemControl.FsControlCode 是要传递给目标卷的文件系统或文件系统筛选器驱动程序的 FSCTL 函数代码。 仅用于 IRP_MN_USER_FS_REQUEST。
有关 IOCTL 和 FSCTL 请求的详细信息,请参阅 Windows SDK 文档中 的使用 I/O 控制代码 和“设备输入和输出控制代码”。
IrpSp->Parameters.FileSystemControl.InputBufferLength 是 Irp-AssociatedIrp.SystemBuffer> 指向的缓冲区的大小(以字节为单位)。
IrpSp->Parameters.FileSystemControl.OutputBufferLength 是 Irp-UserBuffer 指向的缓冲区的大小(>以字节为单位)。
IrpSp->Parameters.FileSystemControl.Type3InputBuffer 是使用 METHOD_NEITHER 的内核模式请求的输入缓冲区。
IrpSp->Parameters.MountVolume.DeviceObject 指向要装载卷的实际设备的设备对象。 文件系统筛选器驱动程序不应使用此参数。
IrpSp->Parameters.MountVolume.Vpb 指向要装载的卷 (VPB) 的卷参数块。 支持可移动媒体的文件系统可能会将以前使用的 VPB 替换为此参数中传递的 VPB。 在此类文件系统上,装载卷后,无法再假定此指针有效。 筛选这些文件系统的文件系统筛选器驱动程序应使用此参数,如下所示:筛选器应在将 IRP 向下发送到较低级别的驱动程序之前保存 IrpSp-Parameters.MountVolume.Vpb-RealDevice>> 的值。 成功装载卷后,筛选器可以使用指向存储设备对象的此指针来获取正确的 VPB 指针。
IrpSp->Parameters.VerifyVolume.DeviceObject 指向要验证卷的设备对象。
IrpSp->Parameters.VerifyVolume.Vpb 指向要验证的卷的 VPB。
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈