Windows内核情景分析;所有的分析都有ReactOS的源代码(以及部分由微软公开的源代码)作为依据;不清楚版本;
对象管理
Windows把一些核心功能作为内核对象来管理,这些对象是一些结构体,没有封装、继承、多态等高级功能。
内核对象有很多,还可以通过.sys模块添加新类型。
通过OpenFile()通用方式打开对象获得句柄,但底下具体的实现因对象类型不同而异。
OS有个对象类型目录,表结构,存放指向OS里注册的对象类型的指针。对象类型也是struct。
对象数据结构:[object_body|object_head|object_info]。
head里没有挂入队列的链指针。即对象自身并没要求要加入对象目录,它可以是独立的,提供句柄供用户进程控制。
但被多个进程共享,或是被一个进程重复“创建”的对象,在OS中可以通过且只能命名找到它,OS将命名对象加入了对象目录来便于查找。对象目录是树结构,根节点是目录对象(系统内部用struct),普通对象都是叶节点。节点之间通过连接对象连接(普通对象没有链指针),目录节点通过Hash表、对象名来组织叶节点。
打开模式:创建对象,初始化,或已有对象引用计数加1,建立这一次打开的上下文(运行信息:访问权限,占据内存页,换入换出设置等,因具体类型而不同);加入对象目录和进程句柄表,返回句柄表的索引,即Handle,从而建立进程与对象的连接。
每个进程有一个句柄表,表项指向对象的head。有时进程通过一些函数会直接操作内核对象,这时候要挂靠内核句柄表(内核运行也在使用一些对象),copy修改一些句柄值。多个进程的句柄表可以指向同一个对象。
进程与线程也是对象,一个进程创建一个子进程,也就有了这个进程的句柄。
Win内核中是使用对象概念来描述管理内核中使用到的数据结构。
一个对象实际上是分为三部分。
OBJECT_HEADER对象头.
数据本体(比如文件对象File Object、Event等)
附加信息(比如Object Header Name Info等)
结构如下:
//摘录自 Reactos代码
// Object Header
//
typedef struct _OBJECT_HEADER
{
LONG PointerCount;
union
{
LONG HandleCount;
volatile PVOID NextToFree;
};
POBJECT_TYPE Type;
UCHAR NameInfoOffset;
UCHAR HandleInfoOffset;
UCHAR QuotaInfoOffset;
UCHAR Flags;
union
{
POBJECT_CREATE_INFORMATION ObjectCreateInfo;
PVOID QuotaBlockCharged;
};
PSECURITY_DESCRIPTOR SecurityDescriptor;
QUAD Body;
} OBJECT_HEADER, *POBJECT_HEADER;
使用windbg调试windows XP时候 得到结构如下。
lkd> dt _OBJECT_HEADER
nt!_OBJECT_HEADER
+0×000 PointerCount : Int4B
+0×004 HandleCount : Int4B
+0×004 NextToFree : Ptr32 Void
+0×008 Type : Ptr32 _OBJECT_TYPE
+0x00c NameInfoOffset : UChar
+0x00d HandleInfoOffset : UChar
+0x00e QuotaInfoOffset : UChar
+0x00f Flags : UChar
+0×010 ObjectCreateInfo : Ptr32 _OBJECT_CREATE_INFORMATION
+0×010 QuotaBlockCharged : Ptr32 Void
+0×014 SecurityDescriptor : Ptr32 Void
+0×018 Body : _QUAD
看上去应该差不多,REACTOS对于对象头的描述基本与windows一致.其中Body便是对象本体,由于本体结构的多样性,长度是未确定的。所以《windows内核情景分析》中提到,”OBJECT_HEADER_NAME_INFO等放在OBJECT_HEADER下面,用8位字节表示位移量。”
https://www.cnblogs.com/cvbnm/articles/2035473.html
https://www.cnblogs.com/itdef/p/3759951.html?utm_source=tuicool&utm_medium=referral