3类:
1.buffered I/O,复制用户的数据
2.Direct I/O,通过MDLs和KM pointer访问用户数据
3.Neither I/O,使用UM pointer访问用户数据
应避免使用Neither I/O
** IOCTLs可以使用任何类型,所有I/O request必须使用同样的类型(驱动相关)
KMDF驱动在EvtDriverDeviceAdd回调中使用WdfDeviceInitSetIoType(WdfDeviceIoBuffered为默认)来设置transfer类型。
例子:Osrusbfx2设置为buffered I/O
UMDF不用配置类型。
Buffered I/O
copy,数据在请求内置的WDF memory object中。
Direct I/O
IRP中包含MDL地址:缓冲的virtual addr和size,physical pages,操作系统锁定这些物理页,在操作完成后解除锁定。
KMDF驱动可以通过WDF方法读取数据,也可以直接使用MDL
Neither I/O
UMDF
=======
KMDF
若来源于UM caller,I/O manager传递来指针指向用户模式buffer,驱动需要复制数据到KM location,并自行验证,锁定,获得长度。在EvtIoInCallerContext回调函数完成验证。
若来源于KM caller,驱动可以直接访问WDF memory object。
1.buffered I/O,复制用户的数据
2.Direct I/O,通过MDLs和KM pointer访问用户数据
3.Neither I/O,使用UM pointer访问用户数据
应避免使用Neither I/O
** IOCTLs可以使用任何类型,所有I/O request必须使用同样的类型(驱动相关)
KMDF驱动在EvtDriverDeviceAdd回调中使用WdfDeviceInitSetIoType(WdfDeviceIoBuffered为默认)来设置transfer类型。
例子:Osrusbfx2设置为buffered I/O
UMDF不用配置类型。
Buffered I/O
copy,数据在请求内置的WDF memory object中。
Direct I/O
IRP中包含MDL地址:缓冲的virtual addr和size,physical pages,操作系统锁定这些物理页,在操作完成后解除锁定。
KMDF驱动可以通过WDF方法读取数据,也可以直接使用MDL
Neither I/O
UMDF
=======
KMDF
若来源于UM caller,I/O manager传递来指针指向用户模式buffer,驱动需要复制数据到KM location,并自行验证,锁定,获得长度。在EvtIoInCallerContext回调函数完成验证。
若来源于KM caller,驱动可以直接访问WDF memory object。