"WDM Read Write METHOD"是指Windows Driver Model(WDM)中的一种数据传输机制,主要用于设备驱动程序与用户空间应用程序之间的数据交互。WDM是Windows操作系统中广泛使用的驱动模型,旨在提高驱动程序的兼容性和稳定性。
在METHOD_BUFFERED方式下,I/O管理器在系统空间的非分页池中分配一个缓冲区(SystemBuffer),其大小足以容纳输入和输出缓冲区中的最大数据量,并将其地址保存在IRP(I/O请求包)的AssociatedIrp.SystemBuffer字段中。驱动程序通过这个SystemBuffer来处理实际的数据传输。同时,IRP头部的UserBuffer字段被设置为用户缓冲区的虚拟地址。I/O管理器会在IRP传递给驱动程序的Dispatch例程之前或IoCompleteRequest完成IRP之后,负责在SystemBuffer和用户缓冲区之间复制数据。当IRP完成时,驱动程序需要更新IoStatus.Information字段,以指示实际读取或写入的数据字节数。
METHOD_IN_DIRECT和METHOD_OUT_DIRECT方式都涉及到单向缓冲。如果设备需要直接访问I/O请求者的用户空间虚拟内存缓冲区,I/O管理器会创建一个内存描述符表(MDL)来描述用户缓冲区的物理地址,并将MDL的地址放在IRP的MdlAddress字段中供驱动程序使用。同时,也会为SystemBuffer分配非分页系统内存。在METHOD_IN_DIRECT中,MDL描述的是用户空间的输入缓冲区,而SystemBuffer用于输出;而在METHOD_OUT_DIRECT中,这两个角色互换。
METHOD_NEITHER方式下,I/O管理器不提供任何缓冲区,它将用户空间输出缓冲区的虚拟地址放在IRP的UserBuffer字段中,输入缓冲区的地址放在当前IO栈单元的Parameters.DeviceIoControl.Type3InputBuffer中。这种方式适用于驱动程序与用户模式调用者在同一进程上下文的情况,或者当数据量很小且实时性要求不高时。然而,由于没有系统缓冲,这种方式的使用需要谨慎。
在设计DSP-PC系统设备驱动程序时,由于Win32应用程序控制访问底层地址的数据量不大,因此选择了METHOD_BUFFERED方式。对于大量的实时图像数据(例如由DMA方式从DSP图像处理卡上传的场景图像数据)和少量的目标特征数据,可能需要采用不同的方法,如直接数据传输,以满足实时性要求。这表明在选择数据传输方式时,必须综合考虑数据量、实时性需求以及驱动程序和应用程序的交互方式。