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

发送时

I/O 管理器、其他操作系统组件和其他内核模式驱动程序发送IRP_MJ_DEVICE_CONTROL请求。 通常,此 IRP 是代表调用 Win32 DeviceIoControl 函数的用户模式应用程序发送的,或代表名为 ZwDeviceIoControlFile 的内核模式组件发送的。

操作:文件系统驱动程序

文件系统驱动程序应提取和解码文件对象,以确定请求是否已在打开的卷的句柄上发出。 如果是这样,文件系统驱动程序应将 IRP 传递给装载卷的存储设备的设备驱动程序。 否则,驱动程序应使 IRP 失败。

操作:旧版文件系统筛选器驱动程序

筛选器驱动程序应执行任何所需的处理,并根据筛选器的性质完成 IRP 或将其向下传递给堆栈上下一个较低的驱动程序。

参数

文件系统或筛选器驱动程序调用给定 IRP 的 IoGetCurrentIrpStackLocation ,以获取指向 IRP 中其自身堆栈位置的指针。 在以下参数中, Irp 指向 IRP而 IrpSp 指向 IO_STACK_LOCATION。 驱动程序可以使用 IRP 的以下成员和 IRP 堆栈位置中设置的信息来处理设备控制请求。

  • DeviceObject 是指向目标设备对象的指针。

  • Irp->AssociatedIrp.SystemBuffer 指向系统提供的输入缓冲区,该缓冲区将传递给目标设备的设备驱动程序。 用于METHOD_BUFFERED或METHOD_DIRECT I/O。 此参数是否是必需的取决于特定的 I/O 控制代码。

  • Irp->IoStatus 指向一个 IO_STATUS_BLOCK 结构,该结构接收最终完成状态和有关所请求操作的信息。 有关详细信息,请参阅 ZwDeviceIoControlFile中 IoStatusBlock 参数的说明。

  • Irp->MdlAddress 是内存描述符列表的地址, (MDL) 描述要传递给目标设备的设备驱动程序的输出缓冲区。 用于METHOD_DIRECT I/O。 此参数是否是必需的取决于特定的 I/O 控制代码。

  • Irp->RequestorMode 指示请求操作的进程( KernelMode 或 UserMode )的执行 模式

  • Irp->UserBuffer 指向要传递给目标设备的设备驱动程序的调用方提供的输出缓冲区。 用于METHOD_BUFFERED或METHOD_NEITHER I/O。 此参数是可选参数还是必需参数取决于特定的 I/O 控制代码。

  • IrpSp->FileObject 指向与 DeviceObject 关联的文件对象。

    IrpSp-FileObject> 参数包含指向 RelatedFileObject 字段的指针,该字段也是FILE_OBJECT结构。 FILE_OBJECT 结构的 RelatedFileObject 字段在处理IRP_MJ_DEVICE_CONTROL期间无效,不应使用。

  • IrpSp->MajorFunction 设置为 IRP_MJ_DEVICE_CONTROL。

  • IrpSp->Parameters.DeviceIoControl.InputBufferLengthIrp-AssociatedIrp.SystemBuffer> 指向的缓冲区的大小(以字节为单位)。

  • IrpSp->Parameters.DeviceIoControl.IoControlCode 是要传递给目标设备的设备驱动程序的 IOCTL 函数代码。

    有关 IOCTL 请求的详细信息,请参阅 Windows SDK 文档中 的“使用 I/O 控制代码 ”和“设备输入和输出控制代码”。

  • IrpSp->Parameters.DeviceIoControl.OutputBufferLengthIrp-UserBuffer> 指向的缓冲区的大小(以字节为单位)。

  • IrpSp->Parameters.DeviceIoControl.Type3InputBuffer 是使用METHOD_NEITHER的内核模式请求的输入缓冲区。

另请参阅

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoBuildDeviceIoControlRequest

IoGetCurrentIrpStackLocation

IoGetFunctionCodeFromCtlCode

IRP

IRP_MJ_DEVICE_CONTROL (WDK 内核参考)

使用 I/O 控制代码

ZwDeviceIoControlFile