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