zoukankan      html  css  js  c++  java
  • 【旧文章搬运】从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 256;
    }

    该函数返回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 != -2 && Handle != -1;
    }

    7、ObRegisterCallbacks/ObUnRegisterCallbacks(Win7/Vista新增)
    MSDN上说:The ObRegisterCallbacks routine registers a list of callback routines for thread and process handle operations.
    说得很明确了,只能用于Thread/Process类型,可以在这两个类型的对象的句柄创建前后进行干涉,具体细节后面再说。

    这只是一篇概述,涉及到的细节有时间慢慢说吧~~

  • 相关阅读:
    oracle里某列插入多行数据
    子类与父类的一些关系
    math.round()的值怎么取的
    oracle replace函数
    spring5.1.5使用的jackson依赖版本
    eclipse设置新建jsp页面的默认编码为utf-8
    c3p0启动失败
    sql的左联右联合内联的区别
    eclipse安装spring tools插件的问题
    HTML点击按钮button跳转页面的四种方法
  • 原文地址:https://www.cnblogs.com/achillis/p/10183462.html
Copyright © 2011-2022 走看看