一些USB开发中使用到的函数1。

本文详细介绍了WDF_USB_DEVICE_SELECT_CONFIG函数的作用、参数及其使用方法,同时阐述了WDF_OBJECT_ATTRIBUTES结构的用途,包括如何初始化、设置上下文类型以及上下文空间的创建和使用。此外,文章还提供了实例代码和注意事项,帮助开发者更好地理解和应用这些功能。

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

NTSTATUS WdfUsbTargetDeviceSelectConfig(

 [in]            WDFUSBDEVICE UsbDevice,                    //指向USB设备对象的指针

[in, optional]  PWDF_OBJECT_ATTRIBUTES PipeAttributes,               //指向WDF_OBJECT_ATTRIBUTES结构数据的指针,这个指针用于描述本方法创建的管道的属性

[in, out]       PWDF_USB_DEVICE_SELECT_CONFIG_PARAMS Params);                   //指向WDF_USB_DEVICE_SELECT_CONFIG_PARAMS结构的指针,

                                                                                                                                                         此结构用于本 方法 指定USB设备的CONFIG参数

此函数为USB设备选择一个配置,或者直接配置这个设备,当客户驱动为接口选择配置时

主机控制器驱动会返回一个指向管道的句柄。

 

 PWDF_OBJECT_ATTRIBUTES结构

typedef struct _WDF_OBJECT_ATTRIBUTES {

ULONG                          Size;     //指定本结构的长度

PFN_WDF_OBJECT_CONTEXT_CLEANUP EvtCleanupCallback;    //指向驱动的EvtCleanupCallback回调函数的指针。

PFN_WDF_OBJECT_CONTEXT_DESTROY EvtDestroyCallback;    //指向驱动的EvtDestroyCallback回调函数的指针

WDF_EXECUTION_LEVEL            ExecutionLevel;   //指定设备对象回调函数最高请求级别的WDF_EXECUTION_LEVEL格式的值

WDF_SYNCHRONIZATION_SCOPE      SynchronizationScope;   //决定框架如何使设备对象的回调函数同步的WDF_SYNCHRONIZATION_SCOPE格式的值

WDFOBJECT                      ParentObject;本对象的父对象,如果没有,可以为NULL

 size_t                         ContextSizeOverride; 如果本值不为0,那么这个值会覆盖ContextTypeInfo指针指向的WDF_OBJECT_CONTEXT_TYPE_INFO结构的ContextSize成员值

PCWDF_OBJECT_CONTEXT_TYPE_INFO ContextTypeInfo;指向WDF_OBJECT_CONTEXT_TYPE_INFO结构的指针

} WDF_OBJECT_ATTRIBUTES, *PWDF_OBJECT_ATTRIBUTES;

要初始化WDF_OBJECT_ATTRIBUTES结构,驱动必须调用WDF_OBJECT_ATTRIBUTES_INIT函数

如果要定义context内容,那么你必须使用WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE宏。

当然,你可以使用WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE宏替代上面两个功能。

如果你要创建具有可变长度的create object context space,那么你可以使用ContextSizeOverride

例如你可一定如下包含数组的context space结构


typedef struct _MY_REQUEST_CONTEXT {
  ULONG  ByteCount;
  BYTE  Bytes[1];
} MY_REQUEST_CONTEXT, *PMY_REQUEST_CONTEXT;

WDF_DECLARE_CONTEXT_TYPE(MY_REQUEST_CONTEXT);

那么,如果你的驱动创建的对象要使用这个context space结构的话,你可以利用ContextSizeOverride

给context指定你想要的大小。方法如下:


WDF_OBJECT_ATTRIBUTES MyRequestObjectAttributes;
PMY_REQUEST_CONTEXT pMyContext;

WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(
                                        &MyRequestObjectAttributes,
                                        MY_REQUEST_CONTEXT
                                        );
MyRequestObjectAttributes.ContextSizeOverride =
                          sizeof(MY_REQUEST_CONTEXT) + Num_Extra_Bytes - 1;

 

object context space是驱动分配给对象的用于存储对象指定数据的非分页空间,驱动可以为一个对象分配多个object context space,并为之创建多种结构体,

为定义一个object context space,你的驱动必须调用accessor 方法,这个方法以对象句柄为输入,并返回context space的地址,当你使用windows定义的函数为对象分配一个context space时,你也将context space清零了。如果你的驱动的context space中存储了指向驱动在创建对象时分配给对象的内存的指针,那么你的驱动必须含有EvtCleanupCallback回调函数,以在删除对象时,释放内存。

不同驱动间的object context space内的数据是不可交换的。

使用object context space必须按如下步骤。

1为object context space创建符合你要存储信息要求的结构体。

2对结构体使用WDF_DECLARE_CONTEXT_TYPE(使用上结构体名)或WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(自指定accessor名)宏,这个宏的作用如下:

                   创建并初始化  WDF_OBJECT_CONTEXT_TYPE_INFO结构体

                   定义accessor方法,

3调用WDF_OBJECT_ATTRIBUTES_INIT初始化WDF_OBJECT_ATTRIBUTES结构体。

4调用WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE,使得WDF_OBJECT_ATTRIBUTES结构体的ContextTypeInfo成员指向

上面创建的WDF_OBJECT_CONTEXT_TYPE_INFO结构体

5调用对象创建函数创建对象。调用WdfObjectAllocateContext为对象添加context space。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值