确定 I/O 操作的缓冲方法

与设备驱动程序一样,文件系统负责在用户模式应用程序和系统设备之间传输数据。 操作系统提供以下三种方法来访问数据缓冲区:

  • 缓冲 I/O 中,I/O 管理器为非分页池中的操作分配系统缓冲区。 I/O 管理器将数据从此系统缓冲区复制到应用程序的用户缓冲区,反之亦然,在启动 I/O 操作的线程上下文中。

  • 直接 I/O 中,I/O 管理器探测并锁定用户缓冲区。 然后,它 (MDL) 创建内存描述符列表,以映射锁定的缓冲区。 I/O 管理器在启动 I/O 操作的线程上下文中访问缓冲区。

  • 缓冲 I/O 和直接 I/O 中,I/O 管理器不会分配系统缓冲区,也不会锁定或映射用户缓冲区。 相反,它只是将缓冲区的原始用户空间虚拟地址传递到文件系统堆栈。 驱动程序负责确保它们在启动线程的上下文中执行,并且缓冲区地址有效。

    在尝试使用微筛选器驱动程序之前,必须先验证用户空间中的任何地址。 I/O 管理器和筛选器管理器不验证此类地址,也不验证嵌入到传递给微筛选器驱动程序的缓冲区中的指针。

对于大多数 I/O 处理,所有标准 Microsoft 文件系统既不使用缓冲 I/O,也不使用直接 I/O。

有关缓冲方法的详细信息,请参阅 访问数据缓冲区的方法

对于基于 IRP 的 I/O 操作,使用的缓冲方法是特定于操作的,由以下因素决定:

  • 正在执行的 I/O 操作的类型

  • 文件系统卷DEVICE_OBJECT结构的 Flags 成员的值

  • 对于 I/O 控制 (IOCTL) 和文件系统控制 (FSCTL) 操作,是定义 IOCTL 或 FSCTL 时传递给CTL_CODE宏的 TransferType 参数的值

具有缓冲区的快速 I/O 操作始终不使用缓冲 I/O 或直接 I/O。

文件系统回调操作没有缓冲区。

本节包括:

可IRP-Based或快速 I/O 的操作

遵循设备对象标志的基于 IRP 的 I/O 操作

始终使用缓冲 I/O 的基于 IRP 的 I/O 操作

始终不使用缓冲 I/O 和直接 I/O 的基于 IRP 的 I/O 操作

基于 IRP 的 IOCTL 和 FSCTL 操作

没有缓冲区的基于 IRP 的 I/O 操作