原文发表于百度空间,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对象管理的变化(概述)的更多相关文章

  1. 【旧文章搬运】Win7可变对象头结构之InfoMask解析

    原文发表于百度空间,2010-08-11========================================================================== 对Wind ...

  2. 【旧文章搬运】Win7 OBJECT_HEADER之TypeIndex解析

    原文发表于百度空间,2010-08-09========================================================================== 在Wind ...

  3. 【旧文章搬运】Windows内核常见数据结构(驱动相关)

    原文发表于百度空间,2008-7-24========================================================================== 这些是驱动中 ...

  4. 【旧文章搬运】深入分析Win7的对象引用跟踪机制

    原文发表于百度空间及看雪论坛,2010-09-12 看雪论坛地址:https://bbs.pediy.com/thread-120296.htm============================ ...

  5. 【旧文章搬运】PsVoid中IrpCreateFile函数在Win7下蓝屏BUG分析及解决

    原文发表于百度空间,2010-04-05========================================================================== 这也许是我 ...

  6. 【旧文章搬运】Windbg+Vmware驱动调试入门(四)---VirtualKD内核调试加速工具

    原文发表于百度空间,2009-01-09========================================================================== 今天又想起 ...

  7. 【旧文章搬运】Windbg+Vmware驱动调试入门(二)---Vmware及GuestOS的设置

    原文发表于百度空间,2009-01-08========================================================================== 这一篇是主 ...

  8. 【旧文章搬运】分析了一下360安全卫士的HOOK(二)——架构与实现

    原文发表于百度空间及看雪论坛,2009-10-14 看雪论坛地址:https://bbs.pediy.com/thread-99460.htm 刚发这篇文章的时候,因为内容涉及360的核心产品,文章被 ...

  9. 【旧文章搬运】炉子给的SYSTEM_HANDLE_TYPE有点错误

    原文发表于百度空间,2008-12-03========================================================================== 今天写程序 ...

随机推荐

  1. PPAPI插件的动态创建、改动、删除

    一旦你完毕了PPAPI插件的开发,实际使用时可能会有下列需求: 动态创建PPAPI插件 删除PPAPI插件 改变PPAPI插件的尺寸 实现起来非常easy,从JS里直接訪问DOM(BOM)就可以.以下 ...

  2. WeX5开发指南

    WeX5入门.UI2开发.App开发.服务端开发.扩展资料学习. 1 新手入门 1.1 运行WeX5的demo(视频) 1.2 App开发.调试.打包部署完整过程(视频) 1.3 创建第一个应用(视频 ...

  3. .net 反射访问私有变量和私有方法 如何创建C# Closure ? C# 批量生成随机密码,必须包含数字和字母,并用加密算法加密 C#中的foreach和yield 数组为什么可以使用linq查询 C#中的 具名参数 和 可选参数 显示实现接口 异步CTP(Async CTP)为什么那样工作? C#多线程基础,适合新手了解 C#加快Bitmap的访问速度 C#实现对图片文件的压

    以下为本次实践代码: using System; using System.Collections.Generic; using System.ComponentModel; using System ...

  4. 【随想】android是个什么东西,andorid机制随想

    优秀程序猿的天性就是好奇,软件是怎么运作的.屏幕是怎样显示的.桌面窗口为何能如此人性化的被鼠标拖动? 假设你常常会有这样一些问题迸发在脑海中,恭喜你,你是一名非常有潜力的程序猿. 我在大学读的是自己主 ...

  5. stringByAppendingPathComponent和stringByAppendingString 的区别

    stringByAppendingPathComponent和stringByAppendingString 的区别   stringByAppendingPathComponent NSString ...

  6. MacOS 修改主机名

    修改主机名 sudo scutil --set HostName xxx 修改共享名 sudo scutil --set ComputerName xxx

  7. multimap容器和multiset容器中的find操作

    前言 multimap容器是map容器的“ 增强版 ”,它允许一个键对应多个值.对于map容器来说,find函数将会返回第一个键值匹配元素所在处的迭代器.那么对于multimap容器来说,find函数 ...

  8. iOS开发之加载、滑动翻阅大量图片优化解决方案

    本文转载至 http://mobile.51cto.com/iphone-413267.htm 今天分享一下私人相册中,读取加载.滑动翻阅大量图片解决方案,我想强调的是,编程思想无关乎平台限制.我要详 ...

  9. [Phoenix] 一、快速入门

    Phoenix是一个开源的HBASE SQL层.Phoeinx可以用标准的JDBC API替代HBASE client API来创建表,插入和查询HBASE中的数据. Phoenix作为应用层和HBA ...

  10. 在c代码中获取用户环境变量

    1 extern char ** environ 这是一个字符串数组,最后一个元素是null,即\0. 2 在代码中的使用方法 直接extern char **environ,然后 直接environ ...