对象管理器

  对象管理器使用对象头中保存的数据来管理这些对象,而无需关注它们的类型,标准对象头中的属性

1.对象名称:使一个对象对于其他的进程也是可见的,便于共享

2.对象目录:提供了一个层次结构来存储对象名称

3.安全描述符:决定了谁可以使用该对象,以及允许它们如何使用它

4.配额花费:列出当一个进程打开一个指向该对象的句柄时,针对该进程收取的资源花费额

5.已打开的句柄计数:记录了“打开一个句柄来指向该对象”的次数

6.对象类型:指向一个类型对象,该对象包含了针对这种类型的对象都是公共的属性

7.引用计数:记录了一个内核模式组件引用该对象地址的次数

除了对象头以外,每个对象也有一个对象体,并且其格式和内容只有这种对象类型才有。

一个执行体组件通过创建一个对象类型,并且为它提供一些服务,就可以控制和维护所有这些类型的对象体中的数据。

对象管理器提供了少量的通用服务来操作对象头中保存的属性,并且可以用在任何类型对象上,windows子系统允许其中一些服务可以直接被windows应用程序使用。这些通用操作有

1.关闭:关闭一个指向某个对象的句柄

2.复制:通过先复制一个句柄,再将其交给另一个进程的方法来共享一个对象

3.查询对象:获得关于一个对象的标准属性信息

4.查询安全性:获取一个对象的安全描述符

5.设置安全性:改变一个对象上的保护设置

6.等待一个对象:用一个对象来同步一个线程的执行

7.等待多个对象:用多个对象来同步一个线程的执行

每个对象都有自己的创建、打开、查询服务(创建一个进程和创建一个文件需要初始化的数据是不同的)

winobj的ObjectTypes中可以看到对象管理器中声明的类型对象的列表

实验:查看对象头和类型对象

1.使用!process 0 0显示系统进程,例如我们选择其中显示的一项

*** NT ACTIVE PROCESS DUMP ****
PROCESS 821b9830  SessionId: none  Cid: 0004    Peb: 00000000  ParentCid: 0000
    DirBase: 00b18000  ObjectTable: e1000c98  HandleCount: 257.
    Image: System

其中PROCESS就是进程内核对象的地址,System进程的进程内核对象地址为821b9830

2.使用!objcet命令显示进程内核系统对象的信息

lkd> !object 821b9830
Object: 821b9830  Type: (821b9e70) Process
    ObjectHeader: 821b9818 (old version)
    HandleCount: 2  PointerCount: 66

3.使用dt命令查看对象头和类型对象

lkd> dt _object_header 821b9818
nt!_OBJECT_HEADER
   +0x000 PointerCount     : 0n66
   +0x004 HandleCount      : 0n2
   +0x004 NextToFree       : 0x00000002 Void
   +0x008 Type             : 0x821b9e70 _OBJECT_TYPE
   +0x00c NameInfoOffset   : 0 ‘‘
   +0x00d HandleInfoOffset : 0 ‘‘
   +0x00e QuotaInfoOffset  : 0 ‘‘
   +0x00f Flags            : 0x22 ‘"‘
   +0x010 ObjectCreateInfo : 0x8055b200 _OBJECT_CREATE_INFORMATION
   +0x010 QuotaBlockCharged : 0x8055b200 Void
   +0x014 SecurityDescriptor : 0xe10003b3 Void
   +0x018 Body             : _QUAD

对象头的起始地址+0x18个字节就是对象体的起始地址(0x821b9818+0x18=0x821b9830)

lkd> dt _object_type 821b9e70
nt!_OBJECT_TYPE
   +0x000 Mutex            : _ERESOURCE
   +0x038 TypeList         : _LIST_ENTRY [ 0x821b9ea8 - 0x821b9ea8 ]
   +0x040 Name             : _UNICODE_STRING "Process"
   +0x048 DefaultObject    : (null)
   +0x04c Index            : 5
   +0x050 TotalNumberOfObjects : 0x1a
   +0x054 TotalNumberOfHandles : 0x6d
   +0x058 HighWaterNumberOfObjects : 0x1b
   +0x05c HighWaterNumberOfHandles : 0x74
   +0x060 TypeInfo         : _OBJECT_TYPE_INITIALIZER
   +0x0ac Key              : 0x636f7250
   +0x0b0 ObjectLocks      : [4] _ERESOURCE

上面的输出显示出:对象类型结构体包含了对象类型的名称(Name成员),记录了这种类型活动对象的总数,以及这种类型的句柄和对象的尖峰数目。TypeInfo成员保存了一个指针,该指针指向的数据结构保存了对于该对象类型的所有对象都公共的属性,以及一组指向该对象类型的方法的指针

lkd> dt _object_type_initializer 821b9e70+60
nt!_OBJECT_TYPE_INITIALIZER
   +0x000 Length           : 0x4c
   +0x002 UseDefaultObject : 0 ‘‘
   +0x003 CaseInsensitive  : 0 ‘‘
   +0x004 InvalidAttributes : 0xb0
   +0x008 GenericMapping   : _GENERIC_MAPPING
   +0x018 ValidAccessMask  : 0x1f0fff
   +0x01c SecurityRequired : 0x1 ‘‘
   +0x01d MaintainHandleCount : 0 ‘‘
   +0x01e MaintainTypeList : 0 ‘‘
   +0x020 PoolType         : 0 ( NonPagedPool )
   +0x024 DefaultPagedPoolCharge : 0x1000
   +0x028 DefaultNonPagedPoolCharge : 0x290
   +0x02c DumpProcedure    : (null)
   +0x030 OpenProcedure    : (null)
   +0x034 CloseProcedure   : (null)
   +0x038 DeleteProcedure  : 0x805c8f00     void  nt!PspProcessDelete+0
   +0x03c ParseProcedure   : (null)
   +0x040 SecurityProcedure : 0x805ef42e     long  nt!SeDefaultObjectMethod+0
   +0x044 QueryNameProcedure : (null)
   +0x048 OkayToCloseProcedure : (null)

时间: 2024-10-06 15:22:52

对象管理器的相关文章

华为练习 对象管理器

实现对象管理器功能,其中管理的对象有3个外部关键字,要求实现: 增加对象; 删除对象; 判断对象是否存在; 说明: 对象的三个外部关键字分别以KEY1,KEY2,KEY3表示. #include "ObjMgt.h" #include <vector> using namespace std; typedef struct{ unsigned int key1; unsigned int key2; unsigned int key3; }KEY; vector <K

[华为机试练习题]57.对象管理器

题目 代码 /*--------------------------------------- * 日期:2015-07-05 * 作者:SJF0115 * 题目:对象管理器 * 来源:华为机试练习题 -----------------------------------------*/ #include <iostream> #include "ObjMgt.h" #include <vector> using namespace std; struct Ob

Sql Server对象管理器的使用

VS提供了很多便捷的工具,Sql Server对象管理器可以直接在VS里面访问数据库,不用再打开一个Management Studio.这里记录下Sql Server对象管理器的使用. 1.先在视图里面找到SqlServer对象管理器 2.在vs的右侧边栏就会出现. 我们先链接一个localdb,在Sql Server上右键 选择添加Sql Server 会出现下面的对话框,这里填写(LocalDb)\v11.0,选用windows验证.这样就出现本机下面的所有localdb了. 这个是来自MV

深入理解Windows系统——2.Windows对象管理器

Windows对象管理器用于Windows资源管理,包括内核对象(文件对象,事件对象,互斥对象,进程对象,线程对象),GDI对象(位图,画刷,字体,调色板),User对象(快捷键,光标,菜单,窗体) 对象结构 常用的内核对象查看工具 Winobj Process Explorer 内核调试命令:!handle 原文地址:https://blog.51cto.com/14207158/2366371

内存对象管理器(基于数组和链表实现)

1.1 数组的特点 连续的内存空间分配并且顺序存储数据,使用之前需要先分配数组个数: 可以通过下标进行访问修改数据,时间复杂度为O(1); 空间效率不是很好,不能随意修改数组大小: 增删数据需要内存拷贝 1.2 链表的特点 内存空间分配是分散的,非连续的存储数据: 不能通过下标直接访问,查找的时间复杂度为O(n); 增删元素,只需要改变前后指针: 1.3 基于数组和指针实现的对象管理器 结合了数组和链表的优点,可以O(1)查找元素,O(1)增删元素: 需要预分配内存: 2.代码实现(C++) /

用ueditor上传图片、文件等到七牛云存储

ueditor上传文件,是用数据流的形式上传的. 而七牛云存储官方文档中,只提供了文件路径上传的方式. 但是,仅仅是在官方文档中写了这一种方式. 事实上,利用VS的对象管理器,打开Qiniu的dll,我们可以看到以下东西: 其实Qiniu提供的SDK中,是可以利用文件流上传文件的. 所以,根据官方文档提供的案例,我们可以将上传改写成下面的样子: /// <summary> /// 上传文件 /// </summary> /// <param name="key&qu

Atitit.获取主板与bios序列号获取硬件设备信息&#160;&#160;Wmi&#160;wmic&#160;的作用

Atitit.获取主板与bios序列号获取硬件设备信息  Wmi wmic 的作用 1 获取硬件核心基础核心基础Wmi1 2 其他资料2 3 Wmic WMI 命令行接口2 4 Atitit.获取主板与bios序列号2 5 参考3 1 获取硬件核心基础核心基础Wmi WMI,是Windows 2K/XP管理系统的核心:对于其他的Win32操作系统,WMI是一个有用的插件.WMI以CIMOM为基础,CIMOM即公共信息模型对象管理器(Common Information Model Object 

WebApi 文档Swagger

NET WebApi 文档Swagger中度优化 本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文地址:www.cnblogs.com/tdws 写在前面 在后台接口开发中,接口文档是必不可少的.在复杂的业务当中和多人对接的情况下,简单的接口文档又不能满足需求,试想你的单应用后台有几十个模块,几百甚至更多的接口,又有上百个ViewModel.怎么能让人用起来更顺手更明了?本篇介绍第一步的中度优化,下一篇将分享下一阶段的深度优化. 第一篇:ASP.NET WebApi 文档Swagge

NET Core1

NET Core .net core最近园子讨论频率很高的话题,从不久前发布正式版本后,也是开始从netcore官网一步一步走向学习之路:.net跨平台的设计让人很是兴奋起来,因为做了多年的互联网研发者,见识了很多一流大公司对之的态度,在很多应用方面几乎看不到影子,深深感觉发展前景不是很乐观,但现在不同以往跨平台,加上其本身开发特点速度快,和vs神器的存在,我想过几年情况应该会发生很大变化吧:感叹完了,开始正篇吧. 下面是本篇将要分享的学习步奏,对于刚学或者即将要学习的朋友做个相互交流: 1.w