Windows内核对象管理

    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


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值