标题:
[转帖]windows2000堆结构初探
[打印本页]
作者:
x86
时间:
2006-5-27 01:34
标题:
[转帖]windows2000堆结构初探
windows2000堆结构初探 环境: windows2000+sp4 (en) vc6.0 首先让我们来看一段代码,代码是从isno那里抄的: #include
#include
#include
int main (int argc, char *argv[]) { HANDLE hHeap; char *buf1, *buf2; char mybuf[] = "AAAAAAAAAAAAAAAA"; char mybuf2[] = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; hHeap=GetProcessHeap(); buf1 = HeapAlloc(hHeap, 0, 16); strcpy(buf1,mybuf); buf2 = HeapAlloc(hHeap, 0, 32); strcpy(buf2,mybuf2); HeapFree(hHeap, 0, buf1); HeapFree(hHeap, 0, buf2); return 0; } 以debug模式编译,调试此程序,在 hHeap=GetProcessHeap(); 这一行上下断点,F5运行程序 程序在断点处中断,单步跟过(F10),看到此时 hHeap 为0x00130000,这就是进程默认堆的首地址 //hHeap=GetProcessHeap(); ALT+F6 唤出Memory窗口,键入0x00132CC0 00132CB8 69 04 0D 00 00132CBC 00 14 18 00 00132CC0 78 01 13 00 00132CC4 78 01 13 00 //buf1 = HeapAlloc(hHeap, 0, 16); 按F10继续,发现buf1指向0x00132CC0。让我们看看这块内存里的冬冬 00132CB8 05 00 0D 00 00132CBC 00 07 18 00 00132CC0 0D F0 AD BA 00132CC4 0D F0 AD BA 00132CC8 0D F0 AD BA 00132CCC 0D F0 AD BA 00132CD0 AB AB AB AB 00132CD4 AB AB AB AB 00132CD8 00 00 00 00 00132CDC 00 00 00 00 00132CE0 64 04 05 00 00132CE4 00 14 EE FE 00132CE8 78 01 13 00 00132CEC 78 01 13 00 //strcpy(buf1,mybuf); 先不管此时内存中都是什么,F10先 : ] 00132CB8 05 00 0D 00 00132CBC 00 07 18 00 00132CC0 41 41 41 41 00132CC4 41 41 41 41 00132CC8 41 41 41 41 00132CCC 41 41 41 41 00132CD0 00 AB AB AB 00132CD4 AB AB AB AB 00132CD8 00 00 00 00 00132CDC 00 00 00 00 00132CE0 64 04 05 00 00132CE4 00 14 EE FE 00132CE8 78 01 13 00 00132CEC 78 01 13 00 //buf2 = HeapAlloc(hHeap, 0, 32); 继续F10 00132CE0 07 00 05 00 00132CE4 00 07 18 00 00132CE8 0D F0 AD BA 00132CEC 0D F0 AD BA 00132CF0 0D F0 AD BA 00132CF4 0D F0 AD BA 00132CF8 0D F0 AD BA 00132CFC 0D F0 AD BA 00132D00 0D F0 AD BA 00132D04 0D F0 AD BA 00132D08 AB AB AB AB 00132D0C AB AB AB AB 00132D10 00 00 00 00 00132D14 00 00 00 00 00132D18 5D 04 07 00 00132D1C 00 14 EE FE 00132D20 78 01 13 00 00132D24 78 01 13 00 //strcpy(buf2,mybuf2); 接着F10 00132CE0 07 00 05 00 00132CE4 00 07 18 00 00132CE8 62 62 62 62 00132CEC 62 62 62 62 00132CF0 62 62 62 62 00132CF4 62 62 62 62 00132CF8 62 62 62 62 00132CFC 62 62 62 62 00132D00 62 62 62 62 00132D04 62 62 62 62 00132D08 00 AB AB AB 00132D0C AB AB AB AB 00132D10 00 00 00 00 00132D14 00 00 00 00 00132D18 5D 04 07 00 00132D1C 00 14 EE FE 00132D20 78 01 13 00 00132D24 78 01 13 00 仔细比较上面得到的数据,发现有2个结构比较有趣,先让我们来看看第一个结构,堆的末尾结构,16字节 未分配前 第一次HeapAlloc16字节后 第一次HeapAlloc32字节后 00132CB8 69 04 0D 00 00132CE0 64 04 05 00 00132D18 5D 04 07 00 00132CBC 00 14 18 00 --> 00132CE4 00 14 EE FE --> 00132D1C 00 14 EE FE 00132CC0 78 01 13 00 --> 00132CE8 78 01 13 00 --> 00132D20 78 01 13 00 00132CC4 78 01 13 00 00132CEC 78 01 13 00 00132D24 78 01 13 00 首先看到的变化是 69 -> 64 -> 5D 变化了5,7 第一次分配的是16bytes,加上堆管理结构8字节,末尾固定的16字节,一共是40字节,40/8 = 5 第二次分配的是32bytes,加上堆管理结构8字节,末尾固定的16字节,一共是56字节,40/8 = 7 可见每从默认堆分配一次内存时,末尾结构的第一个字节会相应减少 Nbytes/8bytes 个 第2个字节意义和第一个字节一起构成了一个unsigned short,意义是剩下的可分配的空间大小(需*8) 第3,4字节也构成unsigned short,表示前一个堆的大小。 第5个字节一直为0 第6个字节,0x14表示堆末尾,0x07表示非末尾 后2个字节意义未明 78 01 13 00 是指向双指针区,存放的是0x00130178这个地址 由于windows源码被我误删了,看不到堆的真正结构,只有稍后再看了
欢迎光临 黑色海岸线论坛 (http://bbs.thysea.com/)
Powered by Discuz! 7.2