Windows对象(Object)结构--关于Win7的补充
自Window 7开始,_OBJECT_HEADER及其之前的一些结构发生了变化。首先来对比下Win7与XP的_OBJECT_HEADER:
[Windows 7]
0: kd> dt _object_header
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
[Windows XP sp3]
kd> dt _object_header
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
可以看到,+0x008处的指向_OBJECT_TYPE的指针已经没有了,取而代之的是在+0x00c处的类型索引值。
“Vista及其以下版本都是在_object_header结构中保存object_type指针,在Windows7中Object_header只保存Object_type的索引。但Windows7中添加了一个函数,ObGetObjectType,返回Object_type对象指针,所以操作Object_type不需要硬编码了。
NTKERNELAPI
PVOID
NTAPI
ObGetObjectType(
IN PVOID pObject
);
”(见看雪论坛langouster对某贴的