Re: 堆内存数据结构的疑问

WinDbg

堆内存数据结构的疑问


飘 2011-11-10, 15:08 下午
0:000> !heap -p -a 0425BEE8
    address 0425bee8 found in
    _HEAP @ 4200000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        0425bee0 0009 0000  [00]   0425bee8    0003c - (busy)

0:000> !heap -x 0425BEE8
Entry     User      Heap      Segment       Size  PrevSize  Unused    Flags
-----------------------------------------------------------------------------
0425bee0  0425bee8  04200000  19e981a8        48      -            c  LFH;busy

0:000> dt _HEAP_ENTRY 0425bee0
ntdll!_HEAP_ENTRY
   +0x000 Size             : 0xe755
   +0x002 Flags            : 0x7a 'z'
   +0x003 SmallTagIndex    : 0x13 ''
   +0x000 SubSegmentCode   : 0x137ae755 Void
   +0x004 PreviousSize     : 0x6b
   +0x006 SegmentOffset    : 0 ''
   +0x006 LFHFlags         : 0 ''
   +0x007 UnusedBytes      : 0x8c ''
   +0x000 FunctionIndex    : 0xe755
   +0x002 ContextValue     : 0x137a
   +0x000 InterceptorValue : 0x137ae755
   +0x004 UnusedBytesLength : 0x6b
   +0x006 EntryOffset      : 0 ''
   +0x007 ExtendedBlockSignature : 0x8c ''
   +0x000 Code1            : 0x137ae755
   +0x004 Code2            : 0x6b
   +0x006 Code3            : 0 ''
   +0x007 Code4            : 0x8c ''
   +0x000 AgregateCode     : 0x8c00006b`137ae755
命令显示的堆块地址是0425bee0   大于几个大小 怎么不对啊 
UserSize 是 3c
Size 是 9

下面的大小又是48 

de显示的又是+0x000 Size             : 0xe755

到底怎么回事啊?
谢谢~

Re: 堆内存数据结构的疑问


格蠹老雷 2011-11-10, 22:44 下午

很好的问题,早就想聊一下这个问题,写了篇博客: 

http://advdbg.org/blogs/advdbg_system/articles/5152.aspx

 

 

Re: 堆内存数据结构的疑问


飘 2011-11-11, 10:13 上午

非常感谢Raymond 的解答 受益匪浅啊

还有一个疑问 

0:002> dt _heap_entry
ntdll!_HEAP_ENTRY
   +0x000 Size             : Uint2B
   +0x002 Flags            : UChar
   +0x003 SmallTagIndex    : UChar
   +0x000 SubSegmentCode   : Ptr32 Void
   +0x004 PreviousSize     : Uint2B
   +0x006 SegmentOffset    : UChar
   +0x006 LFHFlags         : UChar
   +0x007 UnusedBytes      : UChar
   +0x000 FunctionIndex    : Uint2B
   +0x002 ContextValue     : Uint2B
   +0x000 InterceptorValue : Uint4B
   +0x004 UnusedBytesLength : Uint2B
   +0x006 EntryOffset      : UChar
   +0x007 ExtendedBlockSignature : UChar
   +0x000 Code1            : Uint4B
   +0x004 Code2            : Uint2B
   +0x006 Code3            : UChar
   +0x007 Code4            : UChar
   +0x000 AgregateCode     : Uint8B
我查看了 ntdll!_HEAP_ENTRY 的定义  sizeof是24字节啊  怎么堆头大小才8呢?

Re: 堆内存数据结构的疑问


格蠹老雷 2011-11-11, 20:54 下午

哪里执行的sizeof?在WinDBG里看是8啊:

0:000> ?? sizeof(_HEAP_ENTRY)
unsigned int 8

Powered by Community Server Powered by CnForums.Net