访问数据缓冲区的方法

驱动程序堆栈的主要职责之一是在用户模式应用程序和系统设备之间传输数据。 操作系统提供以下三种用于访问数据缓冲区的方法:

缓冲 I/O
操作系统创建一个非分页系统缓冲区,其大小等于应用程序的缓冲区。 对于写入操作,I/O 管理器在调用驱动程序堆栈之前将用户数据复制到系统缓冲区中。 对于读取操作,I/O 管理器在驱动程序堆栈完成请求的操作后,将数据从系统缓冲区复制到应用程序的缓冲区中。

有关详细信息,请参阅 使用缓冲 I/O

直接 I/O
操作系统在内存中锁定应用程序的缓冲区。 然后,它 (MDL) 创建一个内存描述符列表,用于标识锁定的内存页,并将 MDL 传递给驱动程序堆栈。 驱动程序通过 MDL 访问锁定的页面。

有关详细信息,请参阅 使用直接 I/O

既不是缓冲 I/O,也不是直接 I/O
操作系统将应用程序缓冲区的虚拟起始地址和大小传递给驱动程序堆栈。 缓冲区只能从在应用程序的线程上下文中执行的驱动程序访问。

有关详细信息,请参阅 既不使用缓冲 I/O,也不使用直接 I/O

对于 IRP_MJ_READIRP_MJ_WRITE 请求,驱动程序通过使用每个 DEVICE_OBJECT 结构中的标志来指定 I/O 方法。 有关详细信息,请参阅 初始化设备对象

对于 IRP_MJ_DEVICE_CONTROLIRP_MJ_INTERNAL_DEVICE_CONTROL 请求,I/O 方法由每个 IOCTL 值中包含的 TransferType 值确定。 有关详细信息,请参阅 定义 I/O 控制代码

驱动程序堆栈中的所有驱动程序都必须对每个请求使用相同的缓冲区访问方法,但可能对于最高级别的驱动程序 ((可以使用“两者”方法)除外,而不管较低驱动程序) 使用哪种方法。