【旧文章搬运】从XP到Win7看Windows对象管理的变化(概述)
原文发表于百度空间,2010-08-01
==========================================================================
今天花了一点时间把Windows对象管理的变化看了一下,重点放在了Win7这个新的系统上。
事实上,在对象管理这一部分上,从XP、2003几乎没有什么变化,到Vista以后,对象的管理依然没有太大变化,只是内核多导出了几个与对象操作有关的函数而已。而到了Win7以后,在Vista的基础上变动则比较大,主要是体现在两个方面:
(1)、对象相关结构(OBJECT_HEADER,OBJECT_TYPE,OBJECT_TYPE_INITIALIZER等)的变化
这体现了对象管理内部架构的变化,同时也多导出了几个操作对象结构的函数。以对象头为例:
lkd> dt _OBJECT_HEADER(XP)
nt!_OBJECT_HEADER
+0x000 PointerCount : Int4B
+0x004 HandleCount : Int4B
+0x004 NextToFree : Ptr32 Void
+0x008 Type : Ptr32 _OBJECT_TYPE
+0x00c NameInfoOffset : UChar
+0x00d HandleInfoOffset : UChar
+0x00e QuotaInfoOffset : UChar
+0x00f Flags : UChar
+0x010 ObjectCreateInfo : Ptr32 _OBJECT_CREATE_INFORMATION
+0x010 QuotaBlockCharged : Ptr32 Void
+0x014 SecurityDescriptor : Ptr32 Void
+0x018 Body : _QUAD
kd> dt _OBJECT_HEADER(Win7)
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
对象头的大小不变,依然为0x18,这体现了MS向下兼容的思想。但是从偏移8开始,有4个字段的意义发生了变化.
具体地各个新字段有什么作用,后面再详细讲述。
相关的“新”函数:
PVOID
ObGetObjectType(
IN PVOID Object); PVOID
ObQueryNameInfo(
IN PVOID Object);
二、对对象的引用(Refrence)/反引用(Derefrence)过程的追踪机制增强
具体体现在增加了一系列带有Tag参数的对象引用(Refrence)/反引用(Derefrence)函数,更易于找出对象使用中的“泄漏”(即Refrence和Derefrence次数不匹配)。
在Win7中,以下所有不带Tag的函数均使用一个默认的Tag("tlfD")直接调用带Tag参数的函数完成相应功能。相关函数如下:
ObfDereferenceObjectWithTag/ObfReferenceObjectWithTag
ObDereferenceObjectDeferDelete/ObDereferenceObjectDeferDeleteWithTag
ObReferenceObjectByHandle/ObReferenceObjectByHandleWithTag
ObReferenceObjectByPointer/ObReferenceObjectByPointerWithTag
ObfReferenceObject/ObfReferenceObjectWithTag
ObOpenObjectByPointer/ObOpenObjectByPointerWithTag
这只是其外部表现,在内部实际上大大增强了对象的引用(Refrence)/反引用(Derefrence)跟踪机制(xp/win2k3也有此机制,但相对较弱).
如果你并不想深入了解和使用这个跟踪机制,那大可使用以前版本的函数,具体情况以后会详细详述。
其它增加的函数:
1、ObDeleteCapturedInsertInfo(Vista/Win7新增)
VOID
ObDeleteCapturedInsertInfo(
IN PVOID Object
);
这个函数释放掉对象头中的creation information结构。
2、ObGetFilterVersion(Vista/Win7新增)
USHORT
ObGetFilterVersion()
{
return ;
}
该函数返回ObjectFilter的版本(在ObRegisterCallback时会用到).
3、ObIsDosDeviceLocallyMapped(Vista/Win7新增)
NTSTATS
ObIsDosDeviceLocallyMapped(
IN ULONG Index,
OUT BYTE *DosDeviceState
);
似乎是用于获取某个盘符的映射状态(系统第一次调用时,使用的索引是3,对应于'C',即检查C盘这个符号链接的状态)
6、ObIsKernelHandle(Vista/Win7新增)
其实很简单,判断一下KERNEL_HANDLE标志是否有效,并且不是无效句柄
BOOLEAN
ObIsKernelHandle(
IN HANDLE Handle)
{
return (Handle & 0x80000000) == 0x80000000 && Handle != - && Handle != -;
}
7、ObRegisterCallbacks/ObUnRegisterCallbacks(Win7/Vista新增)
MSDN上说:The ObRegisterCallbacks routine registers a list of callback routines for thread and process handle operations.
说得很明确了,只能用于Thread/Process类型,可以在这两个类型的对象的句柄创建前后进行干涉,具体细节后面再说。
这只是一篇概述,涉及到的细节有时间慢慢说吧~~
【旧文章搬运】从XP到Win7看Windows对象管理的变化(概述)的更多相关文章
- 【旧文章搬运】Win7可变对象头结构之InfoMask解析
原文发表于百度空间,2010-08-11========================================================================== 对Wind ...
- 【旧文章搬运】Win7 OBJECT_HEADER之TypeIndex解析
原文发表于百度空间,2010-08-09========================================================================== 在Wind ...
- 【旧文章搬运】Windows内核常见数据结构(驱动相关)
原文发表于百度空间,2008-7-24========================================================================== 这些是驱动中 ...
- 【旧文章搬运】深入分析Win7的对象引用跟踪机制
原文发表于百度空间及看雪论坛,2010-09-12 看雪论坛地址:https://bbs.pediy.com/thread-120296.htm============================ ...
- 【旧文章搬运】PsVoid中IrpCreateFile函数在Win7下蓝屏BUG分析及解决
原文发表于百度空间,2010-04-05========================================================================== 这也许是我 ...
- 【旧文章搬运】Windbg+Vmware驱动调试入门(四)---VirtualKD内核调试加速工具
原文发表于百度空间,2009-01-09========================================================================== 今天又想起 ...
- 【旧文章搬运】Windbg+Vmware驱动调试入门(二)---Vmware及GuestOS的设置
原文发表于百度空间,2009-01-08========================================================================== 这一篇是主 ...
- 【旧文章搬运】分析了一下360安全卫士的HOOK(二)——架构与实现
原文发表于百度空间及看雪论坛,2009-10-14 看雪论坛地址:https://bbs.pediy.com/thread-99460.htm 刚发这篇文章的时候,因为内容涉及360的核心产品,文章被 ...
- 【旧文章搬运】炉子给的SYSTEM_HANDLE_TYPE有点错误
原文发表于百度空间,2008-12-03========================================================================== 今天写程序 ...
随机推荐
- WMS8_基本操作
建立分拣[收货.出货.领料] 点击仪表盘上的任何一个 All operations 链接切换至分拣 列表视图 点击 creae 按钮,建立一个新的分拣 part ...
- 笔记本Charge与Vcore方案
一.笔记本Vcore方案 EC管理智能电池的方案名词简介 我所知道的EC====>Battery 立錡VCORE解決方案簡介 ATX Power Supply 涡轮加速升压(turbo-boo ...
- 抽象类的子类能够new
纠结了半天,我以为继承了Activity后不能new这里被那个onCreate方法迷惑了以为会出现故障一直没直接创建对象类使用 后来试了试才知道 activity似乎是一个抽象类吧. 你要用他的方法, ...
- Server.xml配置详解
<Server port="8005" shutdown="SHUTDOWN"> <!-- 属性说明 port:指定一个端口,这个端口负责监听 ...
- wordpress系列1:安装
https://wordpress.org/download/release-archive/ 官方中文网站:https://cn.wordpress.org/ readme.html文件,可查看Wo ...
- Linux 系统编程中环境变量的使用
前言 在 UNIX Like 系统中,存有各类系统/应用程序的环境变量,可通过修改之改变系统/应用程序的执行效果:除此之外,用户还可以定义自己的环境变量,供自己写的程序使用.本文将说明如何在程序中设置 ...
- Android中通过GPS或NetWork获取当前位置的经纬度
今天在Android项目中要实现一个通过GPS或NetWork来获取当前移动终端设备的经纬度功能.要实现该功能要用到Android Framework 中的 LocationManager 类.下面我 ...
- 透视WPF 应用程序的利器
当我们看到一些设计新颖的网站时,可以借助浏览器自带的Inspector 工具或插件方便的浏览网站布局结构及逻辑.如果是WPF 应用程序能否看到控件的架构方式呢?本篇将介绍两款工具Snoop 和WPF ...
- 基于EasyIPCamera实现的RTSP跨平台拉模式转发流媒体服务器
本文转自博客:http://blog.csdn.net/xinlanbobo/article/details/53224445 上一篇博客<EasyIPCamera通过RTSP协议接入海康.大华 ...
- spring 集成 mybatis 后数据源初始化失败问题分析
问题背景: 项目使用spring,springmvc框架,后边需操作关系数据库,选择了mybatis + durid,集成mybatis后,项目一直启动失败.错误的原因是dataSource初始化的时 ...