引用计数
内核管理器为每个全局对象维护一个引用计数。
内核对象有一个对象头结构体_object_header。
_object_header里变量PointerCount和HandleCount,就是引用计数。
内核程序可以通过对象指针直接使用内核对象,
用户程序通过获取的有效HANDLE间接使用内核对象。
WDF框架对象不是全局对象,因此,对象管理器不管理WDF框架对象。
通过句柄方式引用WDF框架对象。
上下文空间
WDF框架里把上下文成为Context Space。
框架对象可以拥有若干个上下文空间。
WDF创建上下文空间的方法:
定义一个结构体,保存上下文的内容。
//设备对象的上下文
typedef struct _FDO_CONTEXT
{
WDFDEVICE WdfDevice; // 设备对象
WDFQUEUE ReadQueue; // 读请求队列
WDFQUEUE WriteQueue; // 写请求队列
WDFQUEUE IoctlQueue; // 控制请求队列
//等等上下文结构体内的变量声明。
}FDO_CONTEXT;
定义一个WDF_OBJECT_ATTRIBUTES 类型的变量,
WDF_OBJECT_ATTRIBUTES attributes;
定义WDFDEVICE类型变量:
WDFDEVICE device;
用FDO_CONTEXT类型初始化attributes的上下文类型:
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, FDO_CONTEXT);
创建设备对象:
WdfDeviceCreate(&DeviceInit, &attributes, &device);
创建设备对象成功后,可以通过WDFDEVICE类型参数变量device获得关联到新创建设备对象的句柄。
定义从句柄获得对象上下文空间的函数:
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(FDO_CONTEXT, FdoGetContext)
从句柄获得设备对象上下文空间:
FDO_CONTEXT *fdoContext;
fdoContext = FdoGetContext(device);
fdoContext->WdfDevice = device;
这样子,设备对象的创建,设备上下文的创建获取就完成了。
创建设备对象上下文需要先告知上下文空间长度,一时框架根据长度申请内存;然后是定义一个函数,函数的作用是从框架对象里获得上下文空间指针。
上面是通过对对象属性结构体WDF_OBJECT_ATTRIBUTES 的设置实现的。