您的位置:首页 > 编程语言

跟我一起学习windows驱动编程(引用计数、上下文空间)

2015-10-27 14:47 351 查看

引用计数

内核管理器为每个全局对象维护一个引用计数。

内核对象有一个对象头结构体_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 的设置实现的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: