是driver定义的由object使用的存储区域,UMDF和KMDF有不同的使用方式:
UMDF:存储在callback object中,也能按需要在object中创建
KMDF:driver通常在object中使用context area
UMDF object context Data
=====
UMDF context info in callback object data members
=====
UMDF context area in object
=====
KMDF Object Context Area
KMDF object能具有一至多个context area,area使用nonpaged pool,初始化时被清零,是object的一部分。
第一个Context area和WDM的DEVICE_OBJECT的DeviceExtension等价。
WdfObjectAllocateContext方法
给framework创建的object分配context
给driver创建的objcet分配额外的context
** 一个object里的context必须是不同类型的
context的大小和type放入attributes structure,需要把它传入方法中
framework提供了宏把context和它的type和name关联
使用accessor方法获得context area的指针。
---design---
context很好的用于为I/O request加上信息。context只能被创建它的组件访问,它是数据抽象和包装。若request用于不同的任务,每个任务都有对应的一个context,只有对应的任务才能访问到对应的context。
------------
KMDF在删除对象时删除它的context,而driver无法动态删除context area
设置context area方式:
1.声明type
2.初始化attributes structure
3.给object分派context area
KMDF context area的类型声明
UMDF:存储在callback object中,也能按需要在object中创建
KMDF:driver通常在object中使用context area
UMDF object context Data
=====
UMDF context info in callback object data members
=====
UMDF context area in object
=====
KMDF Object Context Area
KMDF object能具有一至多个context area,area使用nonpaged pool,初始化时被清零,是object的一部分。
第一个Context area和WDM的DEVICE_OBJECT的DeviceExtension等价。
WdfObjectAllocateContext方法
给framework创建的object分配context
给driver创建的objcet分配额外的context
** 一个object里的context必须是不同类型的
context的大小和type放入attributes structure,需要把它传入方法中
framework提供了宏把context和它的type和name关联
使用accessor方法获得context area的指针。
---design---
context很好的用于为I/O request加上信息。context只能被创建它的组件访问,它是数据抽象和包装。若request用于不同的任务,每个任务都有对应的一个context,只有对应的任务才能访问到对应的context。
------------
KMDF在删除对象时删除它的context,而driver无法动态删除context area
设置context area方式:
1.声明type
2.初始化attributes structure
3.给object分派context area
KMDF context area的类型声明
在header file中使用 WDF_DECLARE_CONTEXT_TYPE_WITH_NAME 宏(type,driver相关的name,返回context的pointer)
snippet的Nonpnp.h中的代码例子
typedef struct _REQUEST_CONTEXT { WDFMEMORY InputMemoryBuffer; WDFMEMORY OutputMemoryBuffer; } REQUEST_CONTEXT, *PREQUEST_CONTEXT; WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(REQUEST_CONTEXT, GetRequestContext)
REQUEST_CONTEXT既是type
----初始化attributes structure里面的context related fields--------WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE:在初始化后的sttributes struc设置context
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE:合并了set和对attri struc的初始化。
WDF_OBJECT_ATTRIBUTES attributes; WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, REQUEST_CONTEXT);
----给object分派KMDF context area-----
可以给新建的和已有的object分派contextWdfObjectAllocateContext,参数是一个object的handle,一个初始化后的attributes structure,和指向被分派context area的地址。
status = WdfObjectAllocateContext(Request, &attributes, &reqContext);
framework在删除对象时同时删除context。