驱动程序堆栈的主要职责之一是在用户模式应用程序与系统设备之间传输数据。 作系统提供以下三种方法来访问数据缓冲区:
              
              缓冲 I/O
作系统将创建一个非分页的系统缓冲区,其大小等于应用程序的缓冲区。 对于写入作,I/O 管理器在调用驱动程序堆栈之前将用户数据复制到系统缓冲区。 对于读取作,I/O 管理器在驱动程序堆栈完成请求的作后,将数据从系统缓冲区复制到应用程序的缓冲区中。
有关详细信息,请参阅 使用缓冲 I/O。
              
              直接 I/O
作系统将应用程序的缓冲区锁定在内存中。 然后,它会创建一个内存描述符列表(MDL),用于标识锁定的内存页,并将 MDL 传递给驱动程序堆栈。 驱动程序通过 MDL 访问锁定的页面。
有关详细信息,请参阅 使用直接 I/O。
              
              既不是缓冲 I/O 也不是直接 I/O
作系统将应用程序缓冲区的虚拟起始地址和大小传递给驱动程序堆栈。 缓冲区只能从在应用程序的线程上下文中执行的驱动程序访问。
有关详细信息,请参阅 无需缓冲和直接 I/O 的使用。
对于 IRP_MJ_READ 和 IRP_MJ_WRITE 请求,驱动程序使用每个 DEVICE_OBJECT 结构中的标志来指定 I/O 方法。 有关详细信息,请参阅 初始化设备对象。
对于 IRP_MJ_DEVICE_CONTROL 和 IRP_MJ_INTERNAL_DEVICE_CONTROL 请求,I/O 方法由每个 IOCTL 值中包含的 TransferType 值确定。 有关详细信息,请参阅 定义 I/O 控制代码。
驱动程序堆栈中的所有驱动程序都必须对每个请求使用相同的缓冲区访问方法,除最高级别驱动程序以外(它可以使用“无指定”方法,而不考虑较低驱动程序使用的方法)。