Windows中有很多像进程东西、线程东西、文件东西等等这样的东西,我们称之为Windows内查东西。内查东西是系统地点空间中的一个内存块,由系统创建并维护。内查东西为内核所拥有,而不为进程所拥有,所以差别进程可以访谒同一个内查东西。
二.内查东西布局
每个东西都有东西头和东西体构成。所有类型的东西头布局都是不异的,而布局体部分却各不不异的。下面是内查东西的布局图:
内查东西布局图
图中灰色部分是可能呈现的。每个东西中是否存在这些部分主要由OBJECT_HEADER布局中的相关标识表记标帜来指定。上面的5个布局的格局是固定的;而OBJECT布局体部分倒是各个东西各差此外。需要注意的是:指向东西的指针POBJECT是指向东西体部分,而不是指向东西头的。所以,若需要访谒OBJECT_HEADER,需要将POBJCECT减去0x18而获得。
下面是OBJECT_HEADER的布局
typedef struct _OBJECT_HEADER
{
DWORD PointerCount; // 指针引用的数目
DWORD HandleCount; // 打开句柄的数目
POBJECT_TYPE ObjectType; //指向类型东西的指针
BYTE NameOffset; //东西名的偏移
BYTE HandleDBOffset; // HANDLE DB的偏移
BYTE QuotaChargesOffset; //QUOTA CHARGES的偏移
BYTE ObjectFlags; // 东西标识表记标帜
union
{ // 东西标识表记标帜中OB_FLAG_CREATE_INFO ? ObjectCreateInfo : QuotaBlock
PQUOTA_BLOCK QuotaBlock;
POBJECT_CREATE_INFO ObjectCreateInfo;
};
PSECURITY_DESCRIPTOR SecurityDescriptor;
}OBJECT_HEADER, *POBJECT_HEADER;
三.目录东西
WINDOWS中有20几类无数的内查东西,它们都独登时存在于系统地点空间中。系统操作目录东西将所有的这些东西组织起来。目录东西是一个有37个数组元素构成的哈希(HASH)树。数据布局如下:
Typedef struct _OBJECT_DIRECTORY_ENTY { Struct _OBJECT_DIRECTORY_ENTRY *NextEntry; POBJECT Object }OBJECT_DIRECTORY_ENTRY, *POBJECT_DIRECTORY_ENTRY,**PPOBJECT_DIRECTORY_ENTRY; Typedef struct _OBJECT_DIRECTORY { POBJECT_DIRECTORY_ENTRY HashTable[37]; POBJECT_DIRECTORY_ENTRY CurrentEntry; BOOLEAN CurrentEntryValid; BYTE Reserved1; WORD Reserved2; DWORD Reserved3; }OBJECT_DIRECTORY, *POBJECT_DIRECTORY;
系统将东西名称进行必然的算法得出一个HASH值,算法如下:
//按照名字计算HASH值。 hash = 0; p = (PSHORT)wStr; //存放名称的一个WCHAR数组 while(*p) { Symb = (CHAR)*p; hash = hash * 3 + (hash >> 1); if (Symb < ‘a‘) //<a hash= hash + Symb; else if (Symb <= ‘z‘) //即 a~z hash = hash + Symb - 0x20; else // > z hash = hash + (CHAR)RtlUpcaseUnicodeChar((WCHAR)*p); p ++; } hash = hash % 37; //最终的hash值。
系统将所有不异HASH值的东西链接到响应的数组项中,于是系统中所有元素将摆列成如下的布局图:
系统根目录的东西的指针由ObpRootDirectoryObject来指定。