談windows中的句柄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。所以程序中用到的句柄值並不能直接用來索引句柄表,也就有了「僞索引」說法。
數組