WDF基本对象和句柄定义

1          对象和句柄定义

1.1         struct FX_OBJECT_INFO数组FxObjectsInfo:

Fxobjectinfokm.cpp中定义了一个结构体FX_OBJECT_INFO数组FxObjectsInfo[],WDF自定义的对象,如WDFDRIVER、WDFDEVICE等都在该数组中登记对应的信息。

 

typedef struct _FX_OBJECT_INFO {

    const CHAR* Name;  //WDF对象名

    const CHAR* HandleName;

    USHORT Size; //对象大小

    USHORT ObjectType; //对象类型,enum类型值

} FX_OBJECT_INFO, *PFX_OBJECT_INFO;

 

         WDF使用分别使用宏FX_INTERNAL_OBJECT_INFO_ENTRY和宏FX_INTERNAL_OBJECT_INFO_ENTRY初始化结构体FX_OBJECT_INFO数组FxObjectsInfo。

 

FX_OBJECT_INFO FxObjectsInfo[] = {

   FX_INTERNAL_OBJECT_INFO_ENTRY(FxObject, FX_TYPE_OBJECT),

FX_EXTERNAL_OBJECT_INFO_ENTRY(FxDriver,FX_TYPE_DRIVER, WDFDRIVER),

};

 

用于初始化FxObjectsInfo数组的宏,其定义如下:

 

#define FX_INTERNAL_OBJECT_INFO_ENTRY(_obj,_type)  \

{ #_obj, NULL, sizeof(_obj), _type, }

 

#define FX_EXTERNAL_OBJECT_INFO_ENTRY(_obj,_type, _handletype) \

    {#_obj,                                                   \

     (const CHAR*) (_handletype) #_handletype,                 \

     sizeof(_obj),                                             \

     _type,                                                   \

}

 

我们知道,##在宏定义中有连接两个操作符的作用,#在宏定义中起到将操作符字符化的作用,例如:

#define example(instr) printf("theinput string is:\t%s\n",#instr)

#define example1(instr) #instr

当使用该宏定义时:

example(abc);  在编译时将会展开成:printf("theinput string is:\t%s\n","abc");

string str=example1(abc);  将会展成:stringstr="abc";

 

参照上面的例子,将上面宏运算FX_INTERNAL_OBJECT_INFO_ENTRY(FxObject,FX_TYPE_OBJECT)展开,得到如下结果:

         FX_OBJECT_INFOFxObjectsInfo[] = {

{ “FxObject”,NULL,sizeof(FxObject),FX_TYPE_OBJECT },

};

         最终,FxObjectsInfo[0].Name指向”FxObject”, FxObjectsInfo[0].HandleName为空,

FxObjectsInfo[0].Size=4 FxObjectsInfo[0].ObjectType=枚举值FX_TYPE_OBJECT。

         在继续展开FX_EXTERNAL_OBJECT_INFO_ENTRY(FxDriver,FX_TYPE_DRIVER, WDFDRIVER)宏之前,先看下WDFDRIVER的定义。

 

#ifdef STRICT

typedef void *HANDLE;

#if 0 && (_MSC_VER > 1000)

#define DECLARE_HANDLE(name) structname##__; typedef struct name##__ *name

#else

#define DECLARE_HANDLE(name) structname##__{int unused;}; typedef struct name##__ *name

#endif

 

Windows首先声明HANDLE为void*指针类型,然后,通过宏DECLARE_HANDLE定义了WDFDRIVER__结构体:

Struct WDFDRIVER__

{

         Intunused;

};

紧接着,声明了WDFDRIVER为WDFDRIVER__*指针类型,对于指针而言,HANDLE和WDFDRIVER是等价的(可以相互转换)。这有点类似于MFC,它定义了各种句柄类型,如:

DECLARE_HANDLE(HMODULE); 
DECLARE_HANDLE(HINSTANCE); 
DECLARE_HANDLE(HGLOBAL); 
DECLARE_HANDLE(HDC); 
DECLARE_HANDLE(HWND); 
DECLARE_HANDLE(HMENU); 

 

在实际编码过程中,可能以以下形式

HWND hWnd = FindWindow(…);来获得某个窗口句柄。

上面这段代码等价于:

struct HWND* hWnd = FindWindow(…);

如果做一个简单的转换,可以将struct HWND*以不损失精度为代价,直接转换为void*(即HANDLE)。所以,就本质而言,DECLARE_HANDLE宏仅仅为void*类型新创建一个类型名。

 

1.2         WDF对象和WDM对象的对应关系

虽然用WDF框架开发驱动,但隐约能看到背后WDM的影子。WDF对象亦是如此,就像我们会不自觉的把WDFDRIVER对象和DRIVER_OBJECT对象相互关联起来。证明两者之间确实存在某种关联性,我们还是需要从: FX_INTERNAL_OBJECT_INFO_ENTRY/FX_EXTERNAL_OBJECT_INFO_ENTRY两个宏入手。

         在这两个宏中都有一段计算结构体大小的代码:

#define FX_EXTERNAL_OBJECT_INFO_ENTRY(_obj,_type, _handletype) \

    {#_obj,                                                   \

     (const CHAR*) (_handletype) #_handletype,                 \

     sizeof(_obj),                                             \

     _type,                                                   \

}

 

#define FX_INTERNAL_OBJECT_INFO_ENTRY(_obj,_type)  \

{ #_obj, NULL, sizeof(_obj),_type, }

他们都计算第一个宏参数_obj的大小。对于其他宏参数,不外乎是enum类型和HANDLE类型,因此,我们可以确定,第一个宏参数一定是WDF定义的各种对象类型,即FxObject、FxDriver才是真正的WDF对象。

         FxObject是WDF自定义的对象类型,没有对应的WDM对象,所以先来寻找FxDriver的定义以及对应的WDM对象。

class FxDriver : public FxNonPagedObject,public IFxHasCallbacks

{

friend class FxDevice;

friend class FxPackage;

friend class FxWmiIrpHandler;

 

private:

 

    MxDriverObjectm_DriverObject;

UNICODE_STRING m_RegistryPath;

….

};

WDF定义了一个FxDriver类,类成员变量    MxDriverObject m_DriverObject和UNICODE_STRINGm_RegistryPath的名字很容易让我们联想到WDM中传给驱动入口函数DriverEntry的两个参数类型DRIVER_OBJECT和UNICODE_STRING。再跟进MxDriverObject的定义,它依然是一个WDF类:

class MxDriverObject

{

private:

MdDriverObjectm_DriverObject;

};

恩,看看MdDriverObject的定义:

typedef PDRIVER_OBJECT          MdDriverObject;

MdDriverObject就是WDM中DRIVER_OBJECT类型。至此,我们找到了FxDriver和DRIVER_OBJECT的关联,至于WDFDRIVER可能是创建FxDriver对象后的一个句柄。这个留到后面验证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值