由ObReferenceObject推导windows对象管理器

本文深入解析了Windows内核中对象引用计数的实现原理,包括`ObReferenceObject`函数的工作流程,`CONTAINING_RECORD`宏的使用,以及`OBJECT_HEADER`结构体的解析。
摘要由CSDN通过智能技术生成

#define ObReferenceObject(Object) ObfReferenceObject(Object)

LONG_PTR
FASTCALL
ObfReferenceObject (
    __in PVOID Object
    )

/*++

Routine Description:

    This function increments the reference count for an object.

    N.B. This function should be used to increment the reference count
        when the accessing mode is kernel or the objct type is known.

Arguments:

    Object - Supplies a pointer to the object whose reference count is
        incremented.

Return Value:

    None.

--*/

{
    POBJECT_HEADER ObjectHeader;
    LONG_PTR RetVal;

    ObjectHeader = OBJECT_TO_OBJECT_HEADER( Object );

    RetVal = ObpIncrPointerCount( ObjectHeader );
    ASSERT (RetVal != 1);
    return RetVal;
}


为什么要有这句话

ObjectHeader = OBJECT_TO_OBJECT_HEADER( Object );
#define OBJECT_TO_OBJECT_HEADER( o ) \
    CONTAINING_RECORD( (o), OBJECT_HEADER, Body )

关于CONTAINING_RECORD 这个宏的推导

//
// Calculate the address of the base of the structure given its type, and an
// address of a field within the structure.
//

#define CONTAINING_RECORD(address, type, field) ((type *)( \
                                                  (PCHAR)(address) - \
                                                  (ULONG_PTR)(&((type *)0)->field)))

有一篇文章介绍的很清楚 

这应该是原文地址吧   《我对CONTAINING_RECORD宏的详细解释》 不是的话请作者指出 我进行修正


到这里 我们引申出一个很重要的概念 Windows对象 (Object) 结构, 即对象管理器,不同类型的对象具有相同的Object Header,但Object Body部分却是不同的。

这里有一篇文章介绍的很清楚   Windows对象 (Object) 结构http://blog.csdn.net/sqqsongqiqi/article/details/42557815


我们看一下 OBJECT_HEADER 这个结构体

typedef struct _OBJECT_HEADER {
    LONG_PTR PointerCount;
    union {
        LONG_PTR HandleCount;
        PVOID NextToFree;
    };
    POBJECT_TYPE Type;
    UCHAR NameInfoOffset;
    UCHAR HandleInfoOffset;
    UCHAR QuotaInfoOffset;
    UCHAR Flags;

    union {
        POBJECT_CREATE_INFORMATION ObjectCreateInfo;
        PVOID QuotaBlockCharged;
    };

    PSECURITY_DESCRIPTOR SecurityDescriptor;
    QUAD Body;
} OBJECT_HEADER, *POBJECT_HEADER;

我们看见 QUAD Body; 这个字段便是对象的实体部分,也就是我们经常接触到的DEVICE_OBJECT, FILE_OBJECT等具体的对象类型。

分析完

ObjectHeader = OBJECT_TO_OBJECT_HEADER( Object );
这句话之后, 我们继续分析

RetVal = ObpIncrPointerCount( ObjectHeader );
#define ObpIncrPointerCount(np)           ObpInterlockedIncrement( &np->PointerCount )
很简单的就是 OBJECT_HEADER 其中一个字段PointerCount的引用加1 。

至此ObReferenceObject(Object) 分析完毕。


如有错误,敬请指出, 不胜感激。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值