驱动所创建的设备一般有3种方式:缓冲区方式,直接方式和其他方式(对应DO_BUFFERED_IO, DO_DIRECT_IO和0)。
比如:
fdo->Flags |= DO_BUFFERED_IO
DO_BUFFERED_IO指定当前设备以缓冲区方式工作。
通常用户模式和内核模式交互的时候,用户模式会传一个buffer进来,注意:这个buffer是用户模式的虚拟地址。尽管驱动程序可以访问用户模式的虚拟地址,但是这里有个问题,就是当进程切换的时候,同一个用户模式的虚拟地址对应不同的物理地址,这样当驱动去读取这个地址的时候就会出错,这是灾难性的错误。所以,内核模式的驱动一般都不会直接使用用户模式的虚拟地址(特殊需要也可以使用,但是需要很高的技术要求,而且需要很小心)。
缓冲区方式(DO_BUFFERED_IO)
I/O
管理器先创建一个与用户模式数据缓冲区大小相等的系统缓冲区。驱动程序将使用这个系统缓冲区工作。
I/O
管理器负责在系统缓冲区和用户模式缓冲区之间复制数据。
系统缓冲区的地址用 Irp->AssociatedIrp.SystemBuffer