IRP_MJ_CREATE_MAILSLOT (FS 和筛选器驱动程序)

发送时间

创建或打开新 mailslot 时,I/O 管理器会发送IRP_MJ_CREATE_MAILSLOT请求。 通常发送此 IRP:

如果 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 指示请求操作的进程( KernelModeUserMode)的执行模式。 如果设置了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 位对应于 IoCreateFileSpecifyDeviceObjectHintDisposition 参数。

    此成员的低 24 位对应于 IoCreateFileSpecifyDeviceObjectHintCreateOptions 参数。

  • IrpSp->Parameters.CreateMailslot.ShareAccess 是为 mailslot 请求的共享访问权限的位掩码。 如果此成员为零,则请求独占访问权限。 有关详细信息,请参阅 IoCreateFileSpecifyDeviceObjectHintShareAccess 参数的说明。

  • IrpSp->Parameters.CreateMailslot.Parameters 是指向 MAILSLOT_CREATE_PARAMETERS 结构的指针,该结构包含创建 mailslot 时的创建参数。

  • IrpSp->FileObject 是指向 I/O 管理器创建的文件对象的指针,该对象表示要创建或打开的邮件图。 当文件系统处理IRP_MJ_CREATE_MAILSLOT请求时,它会将此文件对象中的 FsContext 和可能为 FsContext2 字段设置为特定于文件系统的值。 因此,在文件系统处理创建请求之前, FsContextFsContext2 字段的值不能被视为有效。 有关详细信息,请参阅 文件流、流上下文和 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期间有效。

另请参阅

ACCESS_MASK

ACCESS_STATE

FLT_PARAMETERS

IRP_MJ_CREATE_MAILSLOT 的 FLT_PARAMETERS

FltCancelFileOpen

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoCancelFileOpen

IoCreateFile

IoCreateFileSpecifyDeviceObjectHint

IoCreateStreamFileObject

IoCreateStreamFileObjectLite

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_CLEANUP

IRP_MJ_CLOSE

IRP_MJ_CREATE (WDK 内核参考)

MAILSLOT_CREATE_PARAMETERS