Windows对象管理器的基本设计意图是:
每一个对象都由两部分构成:对象头和对象体,所有对象的对象头都具有统一的格式,对象头包含了对象管理所需要的基本信息,包括对象名称、类型、引用计数以及安全描述符等。在Windows中,每一种对象都需要一个对应类型的类型对象(即OBJECT_TYPE对象)。系统定义的对象种类是有限的,WRK支持31种对象(内置),各有一个全局的POBJECT。TYPE变量指向其类型对象。
WRK限定不超过48个类型对象,系统全局变量ObpObjectTypes数组记录了所有已创建的类型对象。
对象的构造是由两部分来完成的:(1)调用ObCreateObject,根据指定的类型对象来完成对象头的初始化,并且按照指定的大小来分配对象体的内存;(2)完成对象体的初始化。前者可以统一完成,而后者不可以,因为各种类型的对象有自己不同的初始化逻辑。
类型对象可以跟踪记录当前所有此种类型的对象。因为所有的对象都是在ObpAllocateObject和ObpFreeobject中分配和释放的。
对象管理器的两个接口函数ObOpenObjectByName和ObReferenceObjectByName,正是通过ObpLookupObjectName来完成其打开对象或引用对象的功能的,另一个接口函数ObInsertObject,它的作用是把一个对象插入到一个进程的句柄表中,它也通过ObpLookupObjectName来验证待插入的对象是否在全局名字空间中并不存在。
ObpLookupObjectName的基本执行逻辑:
进程如果需要使用对象,必须通过句柄来完成。在内核中,将一个句柄转换成对应的对象,可以通过ObReferenceObjectByHandle函数来完成。
对象的声明周期由对象的引用计数来管理,一旦引用计数为零,则对象的声明周期结束,它所占用的内存也可以被回收。对象的引用计数来源于两个方面:(1)内核中指针引用;(2)进程打开一个对象并获得一个句柄,它以后通过此句柄来引用此对象。