windows中的对象和高级编程语言中所说的对象还欧区别,准确来讲,windows中的对象其实指的是一种数据结构并且是一种带着“对象头(object head)” 的数据结构!

 所以windows中的对象可以基本分为三个部分:对象头、基本对象结构、可选部分!
 对象数据结构 可以如图所示  
objectheader结构定义
 lkd> dt _object_header
nt!_OBJECT_HEADER
+0x000 PointerCount : Int4B
+0x004 HandleCount : Int4B
+0x004 NextToFree : Ptr32 Void
+0x008 Lock : _EX_PUSH_LOCK
+0x00c TypeIndex : UChar
+0x00d TraceFlags : UChar
+0x00e InfoMask : UChar
+0x00f Flags : UChar
+0x010 ObjectCreateInfo : Ptr32 _OBJECT_CREATE_INFORMATION
+0x010 QuotaBlockCharged : Ptr32 Void
+0x014 SecurityDescriptor : Ptr32 Void
+0x018 Body : _QUAD
                                          

而创建对象后就会返回句柄,相关进程可以通过句柄来使用此对象,所以对象可以有名和可以无名。
但是大部分情况,对象还是需要名字的,有名对象的组织就成了一个问题!
在windows中通过OBJECT_DIRECTORY目录对项来管理!
我们看下OBJECT_DIRECTORY结构:
 lkd> dt _object_directory
nt!_OBJECT_DIRECTORY
+0x000 HashBuckets : [] Ptr32 _OBJECT_DIRECTORY_ENTRY
+0x094 Lock : _EX_PUSH_LOCK
+0x098 DeviceMap : Ptr32 _DEVICE_MAP
+0x09c SessionId : Uint4B
+0x0a0 NamespaceEntry : Ptr32 Void
+0x0a4 Flags : Uint4B
对象目录是由多个节点连接而成的树状结构(不考虑符号连接),树的根是一个目录对象,且树中的每个节点都是对象。除根节点之外,所有的中间节点都必须是目录对象或者符号链接对象(OBJECT_SYMBOLIC_LINK对象),普通的对象只能成为叶节点
看OBJECT_DIRECTORY结构中的第一个元素,是一个OBJECT_DIRECTORY_ENTRY结构指针数组,灭个指针用来维系一个目录项结构的队列,注意,除根节点外,每一个对象都需要借助于目录项结构才能插入目录!
 lkd> dt nt!_object_directory_entry
+0x000 ChainLink : Ptr32 _OBJECT_DIRECTORY_ENTRY
+0x004 Object : Ptr32 Void
+0x008 HashValue : Uint4B
第一个元素仍然指向一个object_directory_entry结构,Object是其连接的对象。
                

由上图可以看到目录项可以和具体的普通对象结合插入对象目录,也可以和目录节点对象结合又形成一个目录。
分析下上面的图:
根节点是一个目录对象,主体是一个HASH表,这里只表现了其中的两个队列,每一个队列上的目录项(对象)具有相同的HASH值,结合具体的文件便可以轻松理解!

最新文章

  1. Hadoop的核心组件和生态圈
  2. call 和 apply使用
  3. CSS3按钮鼠标悬浮光圈效果
  4. JSP开发模式1(简单注册功能)
  5. 【转】 NSString / NSMutableString 字符串处理,常用代码 (实例)
  6. 计算机安装了IE8一半退出重启时,桌面只显示背景
  7. RPC框架基本原理(二):客户端注册
  8. win7系统,apache2.2下添加PHP5的配置详解
  9. 20160215.CCPP体系详解(0025天)
  10. javascript 数组的简单应用
  11. AbstractQueuedSynchronizer-AQS
  12. 代码的重构(Refactor-Extract)
  13. 在Win环境下配置java的环境进行开发步骤
  14. WebDriver高级应用实例(9)
  15. 20145234黄斐《java程序设计》第六周
  16. Failed to execute request because the App-Domain could not be created. Error: 0x8007000e 存储空间不足,无法完成此操作。
  17. 以AVL树为例理解二叉树的旋转(Rotate)操作
  18. 【SSH网上商城项目实战24】Struts2中如何处理多个Model请求
  19. Android启动外部应用的方法
  20. Mysql储存过程6: in / out / inout

热门文章

  1. GuozhongCrawler看准网爬虫动态切换IP漫爬虫
  2. UCOS2_STM32移植详细过程(汇总)
  3. Scala + Play + Sbt + Protractor = One Build
  4. 获取checkbox 组成字符串
  5. EasyUI 异步Tree
  6. 小结:A* & IDA* & 迭代深搜
  7. React 创建自己定义控件
  8. sgu 326(经典网络流构图)
  9. sublime window 配置记录 (转)
  10. 简单脱壳教程笔记(8)---手脱EZIP壳