首页
社区
课程
招聘
[求助]驱动对象指针-0x10指向的ULONG是对象头的什么成员?
发表于: 2009-7-5 17:11 3977

[求助]驱动对象指针-0x10指向的ULONG是对象头的什么成员?

2009-7-5 17:11
3977
//驱动入口函数
extern "C" NTSTATUS DriverEntry (
                        IN PDRIVER_OBJECT pDriverObject,//系统传给驱动程序入口函数的驱动对象
                        IN PUNICODE_STRING pRegistryPath//
                        )
{...}
小弟不太明白:*(ULONG*)((ULONG)pDriverObject-0x10)是否是OBJECT_HEADER的:Type 成员,还是NameInfoOffset成员?请师傅帮帮忙!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
2
看看这个有能找到点什么。按我的理解,应该是type

http://blog.csdn.net/I2Cbus/archive/2008/05/21/2466316.aspx
2009-7-6 19:11
0
雪    币: 267
活跃值: (438)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
3
我在 http://www.nirsoft.net/kernel_struct/vista/OBJECT_HEADER.html 上看的Windows Vista :OBJECT_HEADER定义是:(我在网上好像看过说明Windows 2k,Windows Vista,Windows xp都是这样定义OBJECT_HEADER的)
typedef struct _QUAD
{
     union
     {
          INT64 UseThisFieldToCopy;
          Float DoNotUseThisField;
     };
} QUAD, *PQUAD;
typedef struct _OBJECT_HEADER
{
     LONG PointerCount;
     union
     {
          LONG HandleCount;
          PVOID NextToFree;
     };
     POBJECT_TYPE Type;
     UCHAR NameInfoOffset;
     UCHAR HandleInfoOffset;
     UCHAR QuotaInfoOffset;
     UCHAR Flags;
     union
     {
          POBJECT_CREATE_INFORMATION ObjectCreateInfo;
          PVOID QuotaBlockCharged;
     };
     PVOID SecurityDescriptor;
     QUAD Body;
} OBJECT_HEADER, *POBJECT_HEADER;

如果是这样的定义,为什么看雪上会有一篇翻译的文章说Windows XP SP2 英文版OBJECT_HEADER的大小是:0x18
好像翻译文章也有问题:+0x018 Body      : _QUAD  应该说Body在OBJECT_HEADER的偏移是:0x18,而OBJECT_HEADER的大小应该是:0x18+8(大小32字节)才对啊!真是糟糕!
2009-7-6 21:18
0
雪    币: 267
活跃值: (438)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
4
而且OBJECT_HEADER的定义是按:1字节对齐的!!
2009-7-6 21:21
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
5
这里的QUAD不是LARGE_INGETER中的QuadPart,它其实就是实际的内核对象的占位符,或者说就是为了让编译器计算偏移地址(比如CONTAINING_RECORD()宏)的一个(伪)字段。不同的内核对象,这个字段就用不同的对象来替换了。

而QUAD被定义为union,而不是一个struct,这样就可以对类似这样的错误的代码产生编译错误:
OBJECT_HEADER someObjectHeader = OBJECT_TO_OBJECT_HEADER(someObject);
someObjectHeader.[COLOR="Red"]Body[/COLOR] ...


QUAD的定义如下,并且这也说明这个union是不可以直接引用的:
typedef struct _QUAD
{
     union
     {
          INT64 UseThisFieldToCopy;
          Float DoNotUseThisField;
     };
} QUAD, *PQUAD;
2009-7-7 21:12
0
游客
登录 | 注册 方可回帖
返回
//