创建mem obj和buffer的方法
1.一个函数同时分配buffer和memory obj
2.创建一个memory obj,然后把它和一个已存在的buffer关联
创建请求时,驱动可以同时创建mem obj,也可以关联一个已存的mem obj
mem obj默认的父亲是创建它的驱动,若需要,则手动设置父亲为I/O request/device obj
需要正确设置parent:
KMDF:object attr structure的ParentObject域
UMDF:IWDFObject接口
Buffer类型:
UMDF不需要nonpaged memory
KMDF:分为paged or nonpaged pool。
同步的request中,mem obj和buffer生命周期是一致的,所以驱动可以用PVOID或PMDL指向buffer
非同步request中,驱动必须使用WDF memory obj,这样framework才可以保证buffer直到I/O请求完成前都一直存在。
同时创建Memory object和buffer
UMDF:IWDFDriver::CreateWdfMemory
KMDF:WdfMemoryCreate
此时buffer和mem obj的生命周期一致。
使用已有的buffer创建memory object
比如使用已有的device context area
UMDF: IWDFDriver::CreatePreallocatedWdfMemory ,使用IWDFMemory::SetBuffer来关联buffer
KMDF: WdfMemoryCreatePreallocated,使用WdfMemoryAssignBuffer来关联buffer
KMDF: WdfMemoryCreateFromLookaside,关联在lookaside list中的buffer
驱动必须保证直到请求完成buffer仍然存在。此时删除mem obj时不会释放buffer。
重用I/O和request对象:
1.驱动可以对自己创建的mem obj重新分配空间
2.当驱动必须分离I/O请求时,可以重分配请求的mem obj
3.驱动可以把一个mem obj只读分给多个I/O请求
4.UMDF不能重用I/O请求对象
5.KMDF只能重用自己创建的I/O请求对象
mem obj和I/O请求对象的关联
驱动创建mem obj后,驱动必须调用framework来关联mem obj和I/O请求对象,为I/O target格式化请求。framework准备IRP,取出mem obj的reference,reference会在下列事件出现后删除:
1.I/O 请求完成
2.驱动重新格式化I/O请求
3.请求被删除
4.KMDF调用WdfRequestReuse来准备把请求发送给另一个I/O target
UMDF例子
#####
KMDF例子
Usbsamp的 Sys\Bulkrwr.c
创建mem obj和buffer
1.一个函数同时分配buffer和memory obj
2.创建一个memory obj,然后把它和一个已存在的buffer关联
创建请求时,驱动可以同时创建mem obj,也可以关联一个已存的mem obj
mem obj默认的父亲是创建它的驱动,若需要,则手动设置父亲为I/O request/device obj
To … | Set this object as parent … |
---|---|
Delete the memory object when the I/O request is completed | I/O request object |
Retain the memory object for later use in additional I/O requests | Device object |
KMDF:object attr structure的ParentObject域
UMDF:IWDFObject接口
Buffer类型:
UMDF不需要nonpaged memory
KMDF:分为paged or nonpaged pool。
同步的request中,mem obj和buffer生命周期是一致的,所以驱动可以用PVOID或PMDL指向buffer
非同步request中,驱动必须使用WDF memory obj,这样framework才可以保证buffer直到I/O请求完成前都一直存在。
同时创建Memory object和buffer
UMDF:IWDFDriver::CreateWdfMemory
KMDF:WdfMemoryCreate
此时buffer和mem obj的生命周期一致。
使用已有的buffer创建memory object
比如使用已有的device context area
UMDF: IWDFDriver::CreatePreallocatedWdfMemory ,使用IWDFMemory::SetBuffer来关联buffer
KMDF: WdfMemoryCreatePreallocated,使用WdfMemoryAssignBuffer来关联buffer
KMDF: WdfMemoryCreateFromLookaside,关联在lookaside list中的buffer
驱动必须保证直到请求完成buffer仍然存在。此时删除mem obj时不会释放buffer。
重用I/O和request对象:
1.驱动可以对自己创建的mem obj重新分配空间
2.当驱动必须分离I/O请求时,可以重分配请求的mem obj
3.驱动可以把一个mem obj只读分给多个I/O请求
4.UMDF不能重用I/O请求对象
5.KMDF只能重用自己创建的I/O请求对象
mem obj和I/O请求对象的关联
驱动创建mem obj后,驱动必须调用framework来关联mem obj和I/O请求对象,为I/O target格式化请求。framework准备IRP,取出mem obj的reference,reference会在下列事件出现后删除:
1.I/O 请求完成
2.驱动重新格式化I/O请求
3.请求被删除
4.KMDF调用WdfRequestReuse来准备把请求发送给另一个I/O target
UMDF例子
#####
KMDF例子
Usbsamp的 Sys\Bulkrwr.c
创建mem obj和buffer
WDF_OBJECT_ATTRIBUTES objectAttribs; WDFREQUEST Request; WDFMEMORY urbMemory; PURB urb = NULL; WDF_OBJECT_ATTRIBUTES_INIT(&objectAttribs); objectAttribs.ParentObject = Request; status = WdfMemoryCreate( &objectAttribs, NonPagedPool, POOL_TAG, sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER), &urbMemory, (PVOID*) &urb);