【Windows内核原理与实现】读书笔记(三)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了【Windows内核原理与实现】读书笔记(三),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2537字,纯文字阅读大概需要4分钟。
内容图文
原文链接:http://www.cnblogs.com/XjChenny/archive/2012/02/18/2357243.htmlWindows内核中对象管理
Windows对象管理器的基本设计意图是:
- 为执行体的数据结构提供一种统一又可扩展的定义和控制机制。
- 提供统一的安全访问机制。
- 在无需修改已有系统代码的情况下,加入新的对象类型。
- 提供一组标准的API来对对象执行各种操作。
- 提供一种命名机制,与文件系统的命名机制集成在一起。
每一个对象都由两部分构成:对象头和对象体,所有对象的对象头都具有统一的格式,对象头包含了对象管理所需要的基本信息,包括对象名称、类型、引用计数以及安全描述符等。在Windows中,每一种对象都需要一个对应类型的类型对象(即OBJECT_TYPE对象)。系统定义的对象种类是有限的,WRK支持31种对象(内置),各有一个全局的POBJECT。TYPE变量指向其类型对象。
WRK限定不超过48个类型对象,系统全局变量ObpObjectTypes数组记录了所有已创建的类型对象。
对象的构造是由两部分来完成的:(1)调用ObCreateObject,根据指定的类型对象来完成对象头的初始化,并且按照指定的大小来分配对象体的内存;(2)完成对象体的初始化。前者可以统一完成,而后者不可以,因为各种类型的对象有自己不同的初始化逻辑。
类型对象可以跟踪记录当前所有此种类型的对象。因为所有的对象都是在ObpAllocateObject和ObpFreeobject中分配和释放的。
对象管理器的两个接口函数ObOpenObjectByName和ObReferenceObjectByName,正是通过ObpLookupObjectName来完成其打开对象或引用对象的功能的,另一个接口函数ObInsertObject,它的作用是把一个对象插入到一个进程的句柄表中,它也通过ObpLookupObjectName来验证待插入的对象是否在全局名字空间中并不存在。
ObpLookupObjectName的基本执行逻辑:
- 参数检查
- 如果调用者指定了RootDirectoryHandle参数,则利用此RootDirectory的Parse方法来解析对象,直到解析成功或者不成功,或者指示从头解析。
- 如果调用者没有指定RootDirectoryHandle参数,则系统从全局的根目录ObpRootDirectoryObject开始解析。这种情况下,传递进来的对象名称必须以"\"开始。如果待查找的名称仅仅是"\",则执行特殊处理。否则,执行下面的逻辑:(1)首先判断名称是否以"\??\"开头,是的话,需要拿到当前进程的DeviceMap(设备表),以进一步查询。(2)如果名称正好是"\??",则直接返回当前进程的DeviceMap作为结果。(3)调用ObpLookupDirectoryEntry函数,层层递进,或者碰到具有Parse方法的对象,由它来解析余下的名称字符串,或者碰到子目录对象,从而可以在子目录对象中进一步查询下一级名称。
进程如果需要使用对象,必须通过句柄来完成。在内核中,将一个句柄转换成对应的对象,可以通过ObReferenceObjectByHandle函数来完成。
对象的声明周期由对象的引用计数来管理,一旦引用计数为零,则对象的声明周期结束,它所占用的内存也可以被回收。对象的引用计数来源于两个方面:(1)内核中指针引用;(2)进程打开一个对象并获得一个句柄,它以后通过此句柄来引用此对象。
转载于:https://www.cnblogs.com/XjChenny/archive/2012/02/18/2357243.html
内容总结
以上是互联网集市为您收集整理的【Windows内核原理与实现】读书笔记(三)全部内容,希望文章能够帮你解决【Windows内核原理与实现】读书笔记(三)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。