标签:
谈windows中的句柄
1 kd> dt _handle_table 2 nt!_HANDLE_TABLE 3 +0x000 TableCode : Uint4B 4 +0x004 QuotaProcess : Ptr32 _EPROCESS 5 +0x008 UniqueProcessId : Ptr32 Void 6 +0x00c HandleLock : _EX_PUSH_LOCK 7 +0x010 HandleTableList : _LIST_ENTRY //句柄表双向链表 8 +0x018 HandleContentionEvent : _EX_PUSH_LOCK 9 +0x01c DebugInfo : Ptr32 _HANDLE_TRACE_DEBUG_INFO 10 +0x020 ExtraInfoPages : Int4B 11 +0x024 Flags : Uint4B 12 +0x024 StrictFIFO : Pos 0, 1 Bit 13 +0x028 FirstFreeHandle : Uint4B 14 +0x02c LastFreeHandleEntry : Ptr32 _HANDLE_TABLE_ENTRY 15 +0x030 HandleCount : Uint4B 16 +0x034 NextHandleNeedingPool : Uint4B 17 +0x038 HandleCountHighWatermark : Uint4B
1 lkd> dt _HANDLE_TABLE_ENTRY 2 nt!_HANDLE_TABLE_ENTRY 3 +0x000 Object : Ptr32 Void//指向对象的一个指针 4 +0x000 ObAttributes : Uint4B 5 +0x000 InfoTable : Ptr32 _HANDLE_TABLE_ENTRY_INFO 6 +0x000 Value : Uint4B 7 +0x004 GrantedAccess : Uint4B 8 +0x004 GrantedAccessIndex : Uint2B 9 +0x006 CreatorBackTraceIndex : Uint2B 10 +0x004 NextFreeTableEntry : Uint4B
一个进程的句柄表包含了所有已被该进程打开的那些对象的指针。对象句柄是用来检索句柄表的一个“伪索引”。对于句柄表机制,achillis <<Windows句柄表>>系列文章已经分析得很透彻了,只是对“句柄以4为步进”来源不明。经查,根源如下:
typedef struct _EXHANDLE
{
union
{
struct
{
ULONG TagBits:2;
ULONG Index:30;
}
HANDLE GenericHandleOverlay;
#define HANLE_VALUE_INC 4
ULONG_PTR Value;
}
}EXHANDLE,*PEXHANDLE;
此结构正是用来定义句柄类型。低2位TagBits为标志位Windows用于其它用途,故句柄值低2位对其作为句柄表索引本身无意义,所以等于4的倍数。有了以上分析,自然,在用句柄值为索引取句柄表项时,句柄值必须/4。因此程序中用到的句柄值并不能直接用来索引句柄表,也就有了“伪索引”说法。
标签:
原文地址:http://www.cnblogs.com/ck1020/p/5897460.html