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

本文介绍了Windows驱动编程中关于引用计数的概念,内核对象的_Object_header结构体中的PointerCount和HandleCount用于维护引用计数。同时,探讨了WDF框架对象的非全局特性及通过句柄引用的方式。此外,详细阐述了上下文空间(Context Space)在WDF框架中的应用,包括如何创建、获取设备对象的上下文空间,以及定义函数来从句柄获取对象上下文。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引用计数

内核管理器为每个全局对象维护一个引用计数。
内核对象有一个对象头结构体_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 的设置实现的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值