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。