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对象后的一个句柄。这个留到后面验证。

WDF基本对象和句柄定义相关推荐

  1. 8.1 matlab图形窗口与坐标轴(图形对象的句柄和属性、坐标轴的操作、图形窗口的操作)

    1.图形对象的句柄 (1)句柄的概念 在MATLAB中,用句柄来标识对象,通过句柄来访问相应对象的属性:在MATLAB系统中建立-个对象,系统就会建立-个映射该对象的句柄,用于存诸相应对象的属性. 例 ...

  2. python定义匿名函数关键字_python语言的匿名函数、7种可调用对象以及用户定义的可调用类型...

    匿名函数 在python表达式中,用来创建匿名函数的是lambda关键字. lambda函数在python语言中只能使用纯表达式,也就是说,在lambda函数体中不能使用while和try,当然也不能 ...

  3. 内核对象和句柄的介绍及注意事项

    内核对象,句柄 系统会创建几种类型的内核对象,比如访问令牌对象.事件对象.文件对象.文件映射对象.I\O完成端口对象.作业对象.邮件槽对象.互斥量对象.管道对象.进程对象.信号量对象.线程对象.可等待 ...

  4. 创建两个Thread子类,第一个用run()方法启动,并捕获第二个Thread对象的句柄,然后调用wait()。第二个类的run()方法几秒后为第一个线程调用notifAll(),使第一个线程打印消息

    创建两个Thread子类,第一个用run()方法启动,并捕获第二个Thread对象的句柄,然后调用wait().第二个类的run()方法几秒后为第一个线程调用notifAll(),使第一个线程打印消息 ...

  5. [C++] Vector对象的合法定义

    Vector对象的合法定义的几种情况如下: #include < vector >// 创建 vector 对象的各种方法 vector<int> veco; // 空的 ve ...

  6. new创建类对象与直接定义的区别

    <div class="markdown_views"><h1 id="new创建类对象与直接定义的区别">new创建类对象与直接定义的 ...

  7. 编译原理之 短语直接短语句柄 定义与区分

    编译原理之 短语&直接短语&句柄 定义与区分 一.关于短语 二.关于直接短语 三.关于句柄 四.小练习 1.练习一 2.练习二 五.知识加强拓展 1.利用语法树寻找句型的短语.直接短语 ...

  8. 序列化对象为什么需要定义UID值

    序列化对象为什么需要定义serialVersionUID值? 首先,我们先来看看源码是怎么描述的? The serialization runtime associates with each ser ...

  9. VC++窗口对象和句柄

    句柄是窗口资源的标识,它标识资源在系统中所占用的内存块,应用程序通过窗口句柄对窗口进行操作.除了窗口句柄之外,任何一种资源都有它自己的句柄,比如光标句柄.位图句柄等.窗口ID是窗口在应用程序中的唯一标 ...

  10. C++ 笔记(16)— 类和对象(类定义、类实例对象定义、访问类成员、类成员函数、类 public/private/protected 成员、类对象引用和指针)

    1. 类的定义 类定义是以关键字 class 开头,后跟类的名称.并在它后面依次包含类名,一组放在 {} 内的成员属性和成员函数,以及结尾的分号. 类声明将类本身及其属性告诉编译器.类声明本身并不能改 ...

最新文章

  1. JAVA 设计模式 模板方法模式
  2. HDU 6112黑色星期五 蓝桥基拉姆森公式
  3. Ajax-简单的HelloWorld实例,使用了XMLHttpRequest(two)
  4. html 日历系统 源码,calendar.html
  5. spring mvc绑定对象String转Date解决入参不能是Date的问题
  6. 在浏览器里使用SAPGUI里的SE80
  7. element ui封装 tree下拉框
  8. SeaweedFS在.net core下的实践方案
  9. hadoop-2.6.5安装
  10. php-5.6配置,PHP5.6+apache2.4环境配置
  11. python complex 如何取出实数部分_【PYthon报错】np.complex128数字的虚数部分为0j
  12. jQuery日历控件(JS日期拾取器)实用精简
  13. 读什么,让你的生活既有诗又有远方
  14. CS5801HDMI转EDP转换器芯片参考资料|CS5801HDMI转EDP转换方案说明
  15. 3、git 暂存区撤销与删除
  16. linux系统怎么装搜狗输入法_Linux之Ubuntu系统安装搜狗输入法
  17. 从执行计划的预估行数看执行计划是否正确
  18. 运算器和控制器的组成部件及功能
  19. SEOer在网站优化中,如何快速的写出原创的文章?
  20. 寺库拟私有化:报价较发行价缩水75%,趣店为第一大股东

热门文章

  1. wbincms v1.5 综合门户管理系统发布 thinkphp3.2.3+amazui-2.5.2
  2. http://baiy.cn/doc/cpp/inside_exception.htm#栈回退(Stack_Unwind)机制
  3. Unity【Face Cap】- 关于人脸捕捉的解决方案(二)
  4. 湖南省计算机二级官网2020,湖南2020年3月计算机二级考试报名时间安排
  5. 2020年阴历二月二十九 投资理财~业余投资者如果不深入研究财报该怎么办?
  6. PotPlayer和MPC-HC挂载VSFilterMod加载外挂特效字幕的方法
  7. java实现通讯录(手机版)
  8. linux/debian安装wps以及缺失字体,亲测可用
  9. 游戏应用快速审核上架
  10. C语言 PTA 时间换算