WDF_DECLARE_CONTEXT_TYPE_WITH_NAME
2024-01-16
5
0
#define WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(_contexttype, _castingfunction) \
\
WDF_DECLARE_TYPE_AND_GLOBALS( \
_contexttype, \
WDF_GET_CONTEXT_TYPE_INFO(_contexttype), \
NULL, \
WDF_TYPE_DEFAULT_SECTION_NAME) \
\
WDF_DECLARE_CASTING_FUNCTION(_contexttype, _castingfunction)
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME的主要功能是根据提供的结构体信息填充系统定义的结构体WDF_OBJECT_CONTEXT_TYPE_INFO各成员的信息,并生成一个全局的对象。
typedef struct _WDF_OBJECT_CONTEXT_TYPE_INFO {
//
// The size of this structure in bytes
//
ULONG Size;
//
// String representation of the context's type name, i.e. "DEVICE_CONTEXT"
//
PCHAR ContextName;
//
// The size of the context in bytes. This will be the size of the context
// associated with the handle unless
// WDF_OBJECT_ATTRIBUTES::ContextSizeOverride is specified.
//
size_t ContextSize;
//
// If NULL, this structure is the unique type identifier for the context
// type. If != NULL, the UniqueType pointer value is the unique type id
// for the context type.
//
PCWDF_OBJECT_CONTEXT_TYPE_INFO UniqueType;
//
// Function pointer to retrieve the context type information structure
// pointer from the provider of the context type. This function is invoked
// by the client driver's entry point by the KMDF stub after all class
// drivers are loaded and before DriverEntry is invoked.
//
PFN_GET_UNIQUE_CONTEXT_TYPE EvtDriverGetUniqueContextType;
} WDF_OBJECT_CONTEXT_TYPE_INFO, *PWDF_OBJECT_CONTEXT_TYPE_INFO;
全局的对象名称使用WDF_TYPE_NAME_TO_TYPE_INFO宏生成:
#define WDF_TYPE_NAME_TO_TYPE_INFO(_contexttype) \
_WDF_ ## _contexttype ## _TYPE_INFO
故实现代码如下:
WDF_EXTERN_C \
__declspec(allocate( _section )) \
__declspec(selectany) \
extern const WDF_OBJECT_CONTEXT_TYPE_INFO \
WDF_TYPE_NAME_TO_TYPE_INFO(_contexttype) = \
{ \
sizeof(WDF_OBJECT_CONTEXT_TYPE_INFO), \
#_contexttype, \
sizeof(_contexttype), \
_UniqueType, \
_GetUniqueType, \
}; \
其中:bUniqueType为对象的指针,GetUniqueType为NULL