IRP_MJ_CREATE_MAILSLOT (FS 和筛选器驱动程序)
发送时间
创建或打开新 mailslot 时,I/O 管理器会发送IRP_MJ_CREATE_MAILSLOT请求。 通常发送此 IRP:
- 代表已调用 Microsoft Win32 函数(如 CreateMailslot)的用户模式应用程序。
- 或者,代表名为 IoCreateFile 或 IoCreateFileSpecifyDeviceObjectHint的内核模式组件。
如果 mailslot 创建请求成功完成,则应用程序或内核模式组件将收到 mailslot 文件实例的句柄。
IRP_MJ_CREATE_MAILSLOT的处理方式与 IRP_MJ_CREATE大致相同。
操作:文件系统驱动程序
如果目标设备对象是文件系统的控制设备对象,则文件系统驱动程序的调度例程必须执行以下操作:
- 将 Irp-IoStatus.Status> 和 Irp-IoStatus.Information> 设置为适当的值。
- 完成 IRP 并返回相应的 NTSTATUS 值。
否则,文件系统驱动程序应处理创建请求。
操作:旧版文件系统筛选器驱动程序
如果目标设备对象是旧筛选器驱动程序的控制设备对象,那么在将 Irp-IoStatus.Status 和 Irp-IoStatus.Information> 设置为适当的值后,该驱动程序的调度例程必须完成 IRP 并>返回相应的 NTSTATUS 值。
否则,旧筛选器驱动程序应执行任何所需的处理。 根据筛选器的性质,它应完成 IRP 或将其传递给堆栈上下一个较低的驱动程序。
通常,旧筛选器驱动程序不应返回 STATUS_PENDING 以响应 IRP_MJ_CREATE_MAILSLOT。 但是,如果较低级别的驱动程序返回 STATUS_PENDING,则旧版筛选器驱动程序应将此状态值传递到驱动程序链上。
参数
文件系统或旧筛选器驱动程序使用给定的 IRP 调用 IoGetCurrentIrpStackLocation ,以获取指向 IRP 中自己的 堆栈位置 的指针。 在以下参数中,Irp 指向 IRP,IrpSp 指向 IO_STACK_LOCATION。 驱动程序可以使用在 IRP 和 IRP 堆栈位置的以下成员中设置的信息来处理创建 mailslot 请求。
DeviceObject 是指向目标设备对象的指针。
Irp->标志 设置为此请求的以下标志:
- IRP_CREATE_OPERATION
- IRP_DEFER_IO_COMPLETION
- IRP_SYNCHRONOUS_API
Irp->IoStatus 指向一个 IO_STATUS_BLOCK 结构,该结构接收最终完成状态和有关所请求操作的信息。 文件系统将此结构的 Information 成员设置为以下值之一:
- FILE_CREATED
- FILE_OPENED
Irp->RequestorMode 指示请求操作的进程( KernelMode 或 UserMode)的执行模式。 如果设置了SL_FORCE_ACCESS_CHECK标志,则必须执行访问检查,即使 Irp-RequestorMode> 为 KernelMode 也是如此。
IrpSp->MajorFunction 设置为 IRP_MJ_CREATE_MAILSLOT。
IrpSp->可以将标志 设置为SL_FORCE_ACCESS_CHECK。 如果设置了此标志,则即使 Irp-RequestorMode> 的值为 KernelMode,也必须执行访问检查。
*IrpSp->Parameters.CreateMailslot.SecurityContext-AccessState> 是指向ACCESS_STATE结构的指针,其中包含对象的主题上下文、授予的访问权限类型和剩余的所需访问类型。
IrpSp->Parameters.CreateMailslot.SecurityContext-DesiredAccess> 是一个ACCESS_MASK结构,用于指定为 mailslot 请求的访问权限。 有关详细信息,请参阅 IoCreateFileSpecifyDeviceObjectHint的 DesiredAccess 参数的说明。
IrpSp->Parameters.CreateMailslot.Options 是标志的位掩码,用于指定要在创建或打开 mailslot 时应用的选项,以及如果 mailslot 已存在要执行的操作。
此参数的高 8 位对应于 IoCreateFileSpecifyDeviceObjectHint 的 Disposition 参数。
此成员的低 24 位对应于 IoCreateFileSpecifyDeviceObjectHint 的 CreateOptions 参数。
IrpSp->Parameters.CreateMailslot.ShareAccess 是为 mailslot 请求的共享访问权限的位掩码。 如果此成员为零,则请求独占访问权限。 有关详细信息,请参阅 IoCreateFileSpecifyDeviceObjectHint 的 ShareAccess 参数的说明。
IrpSp->Parameters.CreateMailslot.Parameters 是指向 MAILSLOT_CREATE_PARAMETERS 结构的指针,该结构包含创建 mailslot 时的创建参数。
IrpSp->FileObject 是指向 I/O 管理器创建的文件对象的指针,该对象表示要创建或打开的邮件图。 当文件系统处理IRP_MJ_CREATE_MAILSLOT请求时,它会将此文件对象中的 FsContext 和可能为 FsContext2 字段设置为特定于文件系统的值。 因此,在文件系统处理创建请求之前, FsContext 和 FsContext2 字段的值不能被视为有效。 有关详细信息,请参阅 文件流、流上下文和 Per-Stream 上下文。
IoCancelFileOpen (和 FltCancelFileOpen) 在文件对象的 Flags 字段中设置FO_FILE_OPEN_CANCELLED标志。 设置此标志表示已取消IRP_MJ_CREATE_MAILSLOT请求,并将为此文件对象发出 IRP_MJ_CLOSE 请求。 取消创建请求后,无法重新发出该请求。
IrpSp-FileObject> 参数包含指向 RelatedFileObject 字段的指针,该字段也是FILE_OBJECT结构。 FILE_OBJECT 结构的 RelatedFileObject 字段用于指示相对于已打开的文件对象打开了给定 mailslot。 这通常表示相对文件是目录,但基于流的文件可能相对于已存在的文件流打开。 FILE_OBJECT 结构的 RelatedFileObject 字段仅在处理IRP_MJ_CREATE_MAILSLOT期间有效。
另请参阅
IRP_MJ_CREATE_MAILSLOT 的 FLT_PARAMETERS
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈