淺析 Win2K 中堆(Heap)的實現

淺析 Win2K 中堆(Heap)的實現

作者: JIURL

                 主頁: http://jiurl.yeah.net/

    日期: 2003-5-23


    第一 前言

    關於Win2k堆的實現和裏面的數據結構,沒有任何的官方描述(差不多可以這麼說吧),非官方的東西也只要幾篇關於堆溢出的文章提到了一點,還充滿了錯誤(差不錯可以這麼說吧)。本文通過分析,試驗和猜測,來獲得知識,同樣可能充滿了錯誤,大家多保重。我最近在學習Windows系統,如果有哪位有興趣,有時間,也有能力的話非常非常歡迎和我聯繫,或許能互相幫助。本文只是半成品,很多地方沒有力求詳盡,也非常非常歡迎大家對本文進行補充,設計更多的測試,對於堆有更多的瞭解,一定也告訴我。發現錯誤也一定告訴我。

歡迎大家來這裏看看 http://jiurl.cosoft.org.cn/forum/ http://jiurl.yeah.net/  

    第二 對於堆的簡介

    程序中動態的內存申請和釋放是在堆(heap)上實現的,比如C的malloc,free,C++的new,delete等。一個進程可以有多個堆,每個進程都有一個默認的堆,叫進程堆(可以用 GetProcessHeap 活得這個堆的句柄,這個句柄就是這個堆開始處的線性地址)。在可執行文件(也就是PE文件,PE是windows下的可執行文件格式)的PE Header中的OptionalHeader中我們也可以看到關於進程堆的兩個域 SizeOfHeapReserve SizeOfHeapCommit,SizeOfHeapReserve 表示了爲進程堆保留的地址空間,SizeOfHeapCommit 表示了爲進程堆開始提交的實際物理內存。下面看一個堆在使用中會遇到的問題。

CSDN_Dev_Image_2003-5-231811360.gif

某個程序在某個時候動態申請了幾塊大小不等的內存,堆中情況如圖1所示。過了一段兒時間,該程序又釋放了其中幾塊申請的內存,於是堆中情況如圖2所示(白色部分表示釋放的空閒內存,藍色部分表示申請使用的)。可以看到圖2中的堆出現了一些小塊的空閒內存。如果又要動態申請內存,那麼情況會怎麼樣呢?2,4,5現在是空閒塊兒,如果大小能滿足需要的話,就可以用來滿足申請。爲了能夠有比較大的連續塊兒,4,5那樣的連續的空閒塊兒還應該被合併成一塊。爲了使用那些空閒塊,必須要知道他們的位置,以及大小。爲了能有比較大的空閒塊兒,緊挨着的空閒塊兒還需要被合併。然後申請的時候,找每個空閒塊兒,並判斷大小能否滿足,一旦可以滿足就立刻提供使用。上面的這些問題決定了堆的實現方式。從上面的描述我們可以發現堆的一個問題,就是堆上的內存的申請和釋放比較慢,比較費時間(這是相對於堆棧(stack)之類上的內存使用而言的),而且也比較沒準。比如釋放內存的時候,就說不定需要合併內存塊兒。而申請的時候有可能一次就找到合適的空閒塊兒一次就完成申請了,也有可能找到第一個空閒塊,發現大小不合適,於是找下一個空閒塊,發現大小又不合適,就這樣找了49次,才找到合適的空閒塊。可以看到畫的時間多麼沒準,也許是1次,也許是49次。下面我們來淺析一下Win2k中堆的實現。

    第三 淺析Win2k中堆的實現

   調試環境 Win2k VC6 Softice

    注意以debug編譯的程序的heap中的結構和以release編譯的程序的heap中的結構是不一樣的。我們這裏只分析release程序的heap的情況。

    思路是這樣的,先用 HeapCreate 創建一個堆,這個時候堆還沒有任何動態申請的內容。然後把這個時候的堆中的內容保存下來。然後對這個堆進行一些操作,申請幾塊內存,然後釋放幾塊。再把這時的堆的內容保存下來進行比較。

   使用程序如下

#include <windows.h>
#include <stdio.h>
#include <conio.h>

#define N_BUF 8

void main()
{
HANDLE hHeap;

hHeap=HeapCreate(NULL,0x1000,0x10000); 
//getch(); //首先使用第一個getch()使程序停在 HeapCreate 之後,然後使用softice保存堆內容。


char *buf[N_BUF];

char str[14] = "AAAAAAAAAAAAA";

int i;
for(i=0;i<N_BUF;i++)
{
buf[i]=(char*)HeapAlloc(hHeap, 0, 16);
strcpy(buf[i],str);
//printf("%s/n",buf[i]);
}

for(i=1;i<N_BUF;i+=2)
{
HeapFree(hHeap, 0, buf[i]);
}

getch();//第二個getch()使程序使程序停在對堆進行設計好的操作之後,然後用softice保存堆內容。

HeapDestroy(hHeap);

}

首先使用第一個getch()使程序停在 HeapCreate 之後,然後使用softice保存堆內容。第二個getch()使程序使程序停在對堆進行設計好的操作之後,然後用softice保存堆內容。這個程序會動態申請8個16字節大小的內存(分別是0,1,2,3,4,5,6,7)。然後釋放其中的第1,3,5,7塊。

該程序名叫JiurlHeap,所以進程名也叫JiurlHeap,句柄 hHeap 就是該堆的線性地址。當每次用getch()停住之後,ctrl+d打開softice,使用addr JiurlHeap,切換到該進程的地址空間,然後d 該堆的地址,就可以看到這個堆的內容。

HeapCreate之後,內容如下:

0010:00520000 000000C8 00000100 EEFFEEFF 00001000 ................
0010:00520010 00000000 0000FE00 00100000 00002000 ............. ..
0010:00520020 00000200 00002000 00000130 7FFDEFFF ..... ..0......
0010:00520030 06080004 00000000 00000000 00000000 ................
0010:00520040 00000000 00520598 0000000F FFFFFFF8 ......R.........
0010:00520050 00520050 00520050 00520640 00000000 [email protected].....
0010:00520060 00000000 00000000 00000000 00000000 ................
0010:00520070 00000000 00000000 00000000 00000000 ................
0010:00520080 00000000 00000000 00000000 00000000 ................
0010:00520090 00000000 00000000 00000000 00000000 ................
0010:005200A0 00000000 00000000 00000000 00000000 ................
0010:005200B0 00000000 00000000 00000000 00000000 ................
0010:005200C0 00000000 00000000 00000000 00000000 ................
0010:005200D0 00000000 00000000 00000000 00000000 ................
0010:005200E0 00000000 00000000 00000000 00000000 ................
0010:005200F0 00000000 00000000 00000000 00000000 ................
0010:00520100 00000000 00000000 00000000 00000000 ................
0010:00520110 00000000 00000000 00000000 00000000 ................
0010:00520120 00000000 00000000 00000000 00000000 ................
0010:00520130 00000000 00000000 00000000 00000000 ................
0010:00520140 00000000 00000000 00000000 00000000 ................
0010:00520150 00000000 00000000 00000000 00000000 ................
0010:00520160 00000000 00000000 0000FFFF 00000000 ................
0010:00520170 00000000 00000000 00520688 00520688 ..........R...R.
0010:00520180 00520180 00520180 00520188 00520188 ..R...R...R...R.
0010:00520190 00520190 00520190 00520198 00520198 ..R...R...R...R.
0010:005201A0 005201A0 005201A0 005201A8 005201A8 ..R...R...R...R.
0010:005201B0 005201B0 005201B0 005201B8 005201B8 ..R...R...R...R.
0010:005201C0 005201C0 005201C0 005201C8 005201C8 ..R...R...R...R.
0010:005201D0 005201D0 005201D0 005201D8 005201D8 ..R...R...R...R.
0010:005201E0 005201E0 005201E0 005201E8 005201E8 ..R...R...R...R.
0010:005201F0 005201F0 005201F0 005201F8 005201F8 ..R...R...R...R.
0010:00520200 00520200 00520200 00520208 00520208 ..R...R...R...R.
0010:00520210 00520210 00520210 00520218 00520218 ..R...R...R...R.
0010:00520220 00520220 00520220 00520228 00520228 .R. .R.(.R.(.R.
0010:00520230 00520230 00520230 00520238 00520238 0.R.0.R.8.R.8.R.
0010:00520240 00520240 00520240 00520248 00520248 @[email protected].
0010:00520250 00520250 00520250 00520258 00520258 P.R.P.R.X.R.X.R.
0010:00520260 00520260 00520260 00520268 00520268 `.R.`.R.h.R.h.R.
0010:00520270 00520270 00520270 00520278 00520278 p.R.p.R.x.R.x.R.
0010:00520280 00520280 00520280 00520288 00520288 ..R...R...R...R.
0010:00520290 00520290 00520290 00520298 00520298 ..R...R...R...R.
0010:005202A0 005202A0 005202A0 005202A8 005202A8 ..R...R...R...R.
0010:005202B0 005202B0 005202B0 005202B8 005202B8 ..R...R...R...R.
0010:005202C0 005202C0 005202C0 005202C8 005202C8 ..R...R...R...R.
0010:005202D0 005202D0 005202D0 005202D8 005202D8 ..R...R...R...R.
0010:005202E0 005202E0 005202E0 005202E8 005202E8 ..R...R...R...R.
0010:005202F0 005202F0 005202F0 005202F8 005202F8 ..R...R...R...R.
0010:00520300 00520300 00520300 00520308 00520308 ..R...R...R...R.
0010:00520310 00520310 00520310 00520318 00520318 ..R...R...R...R.
0010:00520320 00520320 00520320 00520328 00520328 .R. .R.(.R.(.R.
0010:00520330 00520330 00520330 00520338 00520338 0.R.0.R.8.R.8.R.
0010:00520340 00520340 00520340 00520348 00520348 @[email protected].
0010:00520350 00520350 00520350 00520358 00520358 P.R.P.R.X.R.X.R.
0010:00520360 00520360 00520360 00520368 00520368 `.R.`.R.h.R.h.R.
0010:00520370 00520370 00520370 00520378 00520378 p.R.p.R.x.R.x.R.
0010:00520380 00520380 00520380 00520388 00520388 ..R...R...R...R.
0010:00520390 00520390 00520390 00520398 00520398 ..R...R...R...R.
0010:005203A0 005203A0 005203A0 005203A8 005203A8 ..R...R...R...R.
0010:005203B0 005203B0 005203B0 005203B8 005203B8 ..R...R...R...R.
0010:005203C0 005203C0 005203C0 005203C8 005203C8 ..R...R...R...R.
0010:005203D0 005203D0 005203D0 005203D8 005203D8 ..R...R...R...R.
0010:005203E0 005203E0 005203E0 005203E8 005203E8 ..R...R...R...R.
0010:005203F0 005203F0 005203F0 005203F8 005203F8 ..R...R...R...R.
0010:00520400 00520400 00520400 00520408 00520408 ..R...R...R...R.
0010:00520410 00520410 00520410 00520418 00520418 ..R...R...R...R.
0010:00520420 00520420 00520420 00520428 00520428 .R. .R.(.R.(.R.
0010:00520430 00520430 00520430 00520438 00520438 0.R.0.R.8.R.8.R.
0010:00520440 00520440 00520440 00520448 00520448 @[email protected].
0010:00520450 00520450 00520450 00520458 00520458 P.R.P.R.X.R.X.R.
0010:00520460 00520460 00520460 00520468 00520468 `.R.`.R.h.R.h.R.
0010:00520470 00520470 00520470 00520478 00520478 p.R.p.R.x.R.x.R.
0010:00520480 00520480 00520480 00520488 00520488 ..R...R...R...R.
0010:00520490 00520490 00520490 00520498 00520498 ..R...R...R...R.
0010:005204A0 005204A0 005204A0 005204A8 005204A8 ..R...R...R...R.
0010:005204B0 005204B0 005204B0 005204B8 005204B8 ..R...R...R...R.
0010:005204C0 005204C0 005204C0 005204C8 005204C8 ..R...R...R...R.
0010:005204D0 005204D0 005204D0 005204D8 005204D8 ..R...R...R...R.
0010:005204E0 005204E0 005204E0 005204E8 005204E8 ..R...R...R...R.
0010:005204F0 005204F0 005204F0 005204F8 005204F8 ..R...R...R...R.
0010:00520500 00520500 00520500 00520508 00520508 ..R...R...R...R.
0010:00520510 00520510 00520510 00520518 00520518 ..R...R...R...R.
0010:00520520 00520520 00520520 00520528 00520528 .R. .R.(.R.(.R.
0010:00520530 00520530 00520530 00520538 00520538 0.R.0.R.8.R.8.R.
0010:00520540 00520540 00520540 00520548 00520548 @[email protected].
0010:00520550 00520550 00520550 00520558 00520558 P.R.P.R.X.R.X.R.
0010:00520560 00520560 00520560 00520568 00520568 `.R.`.R.h.R.h.R.
0010:00520570 00520570 00520570 00520608 00000000 p.R.p.R...R.....
0010:00520580 00000000 00000000 00000000 00521000 ..............R.
0010:00520590 0000F000 00000000 005205A8 00000000 ..........R.....
0010:005205A0 00000000 00000000 005205B8 00000000 ..........R.....
0010:005205B0 00000000 00000000 005205C8 00000000 ..........R.....
0010:005205C0 00000000 00000000 005205D8 00000000 ..........R.....
0010:005205D0 00000000 00000000 005205E8 00000000 ..........R.....
0010:005205E0 00000000 00000000 005205F8 00000000 ..........R.....
0010:005205F0 00000000 00000000 00000000 00000000 ................
0010:00520600 00000000 00000000 77FCD640 FFFFFFFF [email protected]....
0010:00520610 00000000 00000000 00000030 00000000 ........0.......
0010:00520620 00000000 00000000 00000000 00000000 ................
0010:00520630 00000000 00000000 00000000 00000000 ................
0010:00520640 00C80008 00000100 FFEEFFEE 00000000 ................
0010:00520650 00520000 0000F000 00520000 00000010 ..R.......R.....
0010:00520660 00520680 00530000 0000000F 00000001 ..R...S.........
0010:00520670 00520588 00000000 00520680 00000000 ..R.......R.....
0010:00520680 00080130 00001000 00520178 00520178 0.......x.R.x.R.
0010:00520690 00000000 00000000 00000000 00000000 ................
0010:005206A0 00000000 00000000 00000000 00000000 ................
0010:005206B0 00000000 00000000 00000000 00000000 ................
0010:005206C0 00000000 00000000 00000000 00000000 ................
0010:005206D0 00000000 00000000 00000000 00000000 ................
0010:005206E0 00000000 00000000 00000000 00000000 ................
0010:005206F0 00000000 00000000 00000000 00000000 ................
0010:00520700 00000000 00000000 00000000 00000000 ................
0010:00520710 00000000 00000000 00000000 00000000 ................
0010:00520720 00000000 00000000 00000000 00000000 ................
0010:00520730 00000000 00000000 00000000 00000000 ................
0010:00520740 00000000 00000000 00000000 00000000 ................
0010:00520750 00000000 00000000 00000000 00000000 ................
0010:00520760 00000000 00000000 00000000 00000000 ................
0010:00520770 00000000 00000000 00000000 00000000 ................
0010:00520780 00000000 00000000 00000000 00000000 ................
0010:00520790 00000000 00000000 00000000 00000000 ................
0010:005207A0 00000000 00000000 00000000 00000000 ................
0010:005207B0 00000000 00000000 00000000 00000000 ................
0010:005207C0 00000000 00000000 00000000 00000000 ................
0010:005207D0 00000000 00000000 00000000 00000000 ................
0010:005207E0 00000000 00000000 00000000 00000000 ................
0010:005207F0 00000000 00000000 00000000 00000000 ................
0010:00520800 00000000 00000000 00000000 00000000 ................
0010:00520810 00000000 00000000 00000000 00000000 ................
0010:00520820 00000000 00000000 00000000 00000000 ................
0010:00520830 00000000 00000000 00000000 00000000 ................
0010:00520840 00000000 00000000 00000000 00000000 ................
0010:00520850 00000000 00000000 00000000 00000000 ................
0010:00520860 00000000 00000000 00000000 00000000 ................
0010:00520870 00000000 00000000 00000000 00000000 ................
0010:00520880 00000000 00000000 00000000 00000000 ................
0010:00520890 00000000 00000000 00000000 00000000 ................
0010:005208A0 00000000 00000000 00000000 00000000 ................
0010:005208B0 00000000 00000000 00000000 00000000 ................
0010:005208C0 00000000 00000000 00000000 00000000 ................
0010:005208D0 00000000 00000000 00000000 00000000 ................
0010:005208E0 00000000 00000000 00000000 00000000 ................
0010:005208F0 00000000 00000000 00000000 00000000 ................
0010:00520900 00000000 00000000 00000000 00000000 ................
0010:00520910 00000000 00000000 00000000 00000000 ................
0010:00520920 00000000 00000000 00000000 00000000 ................
0010:00520930 00000000 00000000 00000000 00000000 ................
0010:00520940 00000000 00000000 00000000 00000000 ................
0010:00520950 00000000 00000000 00000000 00000000 ................
0010:00520960 00000000 00000000 00000000 00000000 ................
0010:00520970 00000000 00000000 00000000 00000000 ................
0010:00520980 00000000 00000000 00000000 00000000 ................
0010:00520990 00000000 00000000 00000000 00000000 ................
0010:005209A0 00000000 00000000 00000000 00000000 ................
0010:005209B0 00000000 00000000 00000000 00000000 ................
0010:005209C0 00000000 00000000 00000000 00000000 ................
0010:005209D0 00000000 00000000 00000000 00000000 ................
0010:005209E0 00000000 00000000 00000000 00000000 ................
0010:005209F0 00000000 00000000 00000000 00000000 ................
0010:00520A00 00000000 00000000 00000000 00000000 ................
0010:00520A10 00000000 00000000 00000000 00000000 ................
0010:00520A20 00000000 00000000 00000000 00000000 ................
0010:00520A30 00000000 00000000 00000000 00000000 ................
0010:00520A40 00000000 00000000 00000000 00000000 ................
0010:00520A50 00000000 00000000 00000000 00000000 ................
0010:00520A60 00000000 00000000 00000000 00000000 ................
0010:00520A70 00000000 00000000 00000000 00000000 ................
0010:00520A80 00000000 00000000 00000000 00000000 ................
0010:00520A90 00000000 00000000 00000000 00000000 ................
0010:00520AA0 00000000 00000000 00000000 00000000 ................
0010:00520AB0 00000000 00000000 00000000 00000000 ................
0010:00520AC0 00000000 00000000 00000000 00000000 ................
0010:00520AD0 00000000 00000000 00000000 00000000 ................
0010:00520AE0 00000000 00000000 00000000 00000000 ................
0010:00520AF0 00000000 00000000 00000000 00000000 ................
0010:00520B00 00000000 00000000 00000000 00000000 ................
0010:00520B10 00000000 00000000 00000000 00000000 ................
0010:00520B20 00000000 00000000 00000000 00000000 ................
0010:00520B30 00000000 00000000 00000000 00000000 ................
0010:00520B40 00000000 00000000 00000000 00000000 ................
0010:00520B50 00000000 00000000 00000000 00000000 ................
0010:00520B60 00000000 00000000 00000000 00000000 ................
0010:00520B70 00000000 00000000 00000000 00000000 ................
0010:00520B80 00000000 00000000 00000000 00000000 ................
0010:00520B90 00000000 00000000 00000000 00000000 ................
0010:00520BA0 00000000 00000000 00000000 00000000 ................
0010:00520BB0 00000000 00000000 00000000 00000000 ................
0010:00520BC0 00000000 00000000 00000000 00000000 ................
0010:00520BD0 00000000 00000000 00000000 00000000 ................
0010:00520BE0 00000000 00000000 00000000 00000000 ................
0010:00520BF0 00000000 00000000 00000000 00000000 ................
0010:00520C00 00000000 00000000 00000000 00000000 ................
0010:00520C10 00000000 00000000 00000000 00000000 ................
0010:00520C20 00000000 00000000 00000000 00000000 ................
0010:00520C30 00000000 00000000 00000000 00000000 ................
0010:00520C40 00000000 00000000 00000000 00000000 ................
0010:00520C50 00000000 00000000 00000000 00000000 ................
0010:00520C60 00000000 00000000 00000000 00000000 ................
0010:00520C70 00000000 00000000 00000000 00000000 ................
0010:00520C80 00000000 00000000 00000000 00000000 ................
0010:00520C90 00000000 00000000 00000000 00000000 ................
0010:00520CA0 00000000 00000000 00000000 00000000 ................
0010:00520CB0 00000000 00000000 00000000 00000000 ................
0010:00520CC0 00000000 00000000 00000000 00000000 ................
0010:00520CD0 00000000 00000000 00000000 00000000 ................
0010:00520CE0 00000000 00000000 00000000 00000000 ................
0010:00520CF0 00000000 00000000 00000000 00000000 ................
0010:00520D00 00000000 00000000 00000000 00000000 ................
0010:00520D10 00000000 00000000 00000000 00000000 ................
0010:00520D20 00000000 00000000 00000000 00000000 ................
0010:00520D30 00000000 00000000 00000000 00000000 ................
0010:00520D40 00000000 00000000 00000000 00000000 ................
0010:00520D50 00000000 00000000 00000000 00000000 ................
0010:00520D60 00000000 00000000 00000000 00000000 ................
0010:00520D70 00000000 00000000 00000000 00000000 ................
0010:00520D80 00000000 00000000 00000000 00000000 ................
0010:00520D90 00000000 00000000 00000000 00000000 ................
0010:00520DA0 00000000 00000000 00000000 00000000 ................
0010:00520DB0 00000000 00000000 00000000 00000000 ................
0010:00520DC0 00000000 00000000 00000000 00000000 ................
0010:00520DD0 00000000 00000000 00000000 00000000 ................
0010:00520DE0 00000000 00000000 00000000 00000000 ................
0010:00520DF0 00000000 00000000 00000000 00000000 ................
0010:00520E00 00000000 00000000 00000000 00000000 ................
0010:00520E10 00000000 00000000 00000000 00000000 ................
0010:00520E20 00000000 00000000 00000000 00000000 ................
0010:00520E30 00000000 00000000 00000000 00000000 ................
0010:00520E40 00000000 00000000 00000000 00000000 ................
0010:00520E50 00000000 00000000 00000000 00000000 ................
0010:00520E60 00000000 00000000 00000000 00000000 ................
0010:00520E70 00000000 00000000 00000000 00000000 ................
0010:00520E80 00000000 00000000 00000000 00000000 ................
0010:00520E90 00000000 00000000 00000000 00000000 ................
0010:00520EA0 00000000 00000000 00000000 00000000 ................
0010:00520EB0 00000000 00000000 00000000 00000000 ................
0010:00520EC0 00000000 00000000 00000000 00000000 ................
0010:00520ED0 00000000 00000000 00000000 00000000 ................
0010:00520EE0 00000000 00000000 00000000 00000000 ................
0010:00520EF0 00000000 00000000 00000000 00000000 ................
0010:00520F00 00000000 00000000 00000000 00000000 ................
0010:00520F10 00000000 00000000 00000000 00000000 ................
0010:00520F20 00000000 00000000 00000000 00000000 ................
0010:00520F30 00000000 00000000 00000000 00000000 ................
0010:00520F40 00000000 00000000 00000000 00000000 ................
0010:00520F50 00000000 00000000 00000000 00000000 ................
0010:00520F60 00000000 00000000 00000000 00000000 ................
0010:00520F70 00000000 00000000 00000000 00000000 ................
0010:00520F80 00000000 00000000 00000000 00000000 ................
0010:00520F90 00000000 00000000 00000000 00000000 ................
0010:00520FA0 00000000 00000000 00000000 00000000 ................
0010:00520FB0 00000000 00000000 00000000 00000000 ................
0010:00520FC0 00000000 00000000 00000000 00000000 ................
0010:00520FD0 00000000 00000000 00000000 00000000 ................
0010:00520FE0 00000000 00000000 00000000 00000000 ................
0010:00520FF0 00000000 00000000 00000000 00000000 ................

做了一些申請和釋放之後,內容如下

0010:00520000 000000C8 00000100 EEFFEEFF 00001000 ................
0010:00520010 00000000 0000FE00 00100000 00002000 ............. ..
0010:00520020 00000200 00002000 00000124 7FFDEFFF ..... ..$......
0010:00520030 06080004 00000000 00000000 00000000 ................
0010:00520040 00000000 00520598 0000000F FFFFFFF8 ......R.........
0010:00520050 00520050 00520050 00520640 00000000 [email protected].....
0010:00520060 00000000 00000000 00000000 00000000 ................
0010:00520070 00000000 00000000 00000000 00000000 ................
0010:00520080 00000000 00000000 00000000 00000000 ................
0010:00520090 00000000 00000000 00000000 00000000 ................
0010:005200A0 00000000 00000000 00000000 00000000 ................
0010:005200B0 00000000 00000000 00000000 00000000 ................
0010:005200C0 00000000 00000000 00000000 00000000 ................
0010:005200D0 00000000 00000000 00000000 00000000 ................
0010:005200E0 00000000 00000000 00000000 00000000 ................
0010:005200F0 00000000 00000000 00000000 00000000 ................
0010:00520100 00000000 00000000 00000000 00000000 ................
0010:00520110 00000000 00000000 00000000 00000000 ................
0010:00520120 00000000 00000000 00000000 00000000 ................
0010:00520130 00000000 00000000 00000000 00000000 ................
0010:00520140 00000000 00000000 00000000 00000000 ................
0010:00520150 00000000 00000000 00000008 00000000 ................
0010:00520160 00000000 00000000 0000FFFF 00000000 ................
0010:00520170 00000000 00000000 00520730 00520730 ........0.R.0.R.
0010:00520180 00520180 00520180 00520188 00520188 ..R...R...R...R.
0010:00520190 005206A0 00520700 00520198 00520198 ..R...R...R...R.
0010:005201A0 005201A0 005201A0 005201A8 005201A8 ..R...R...R...R.
0010:005201B0 005201B0 005201B0 005201B8 005201B8 ..R...R...R...R.
0010:005201C0 005201C0 005201C0 005201C8 005201C8 ..R...R...R...R.
0010:005201D0 005201D0 005201D0 005201D8 005201D8 ..R...R...R...R.
0010:005201E0 005201E0 005201E0 005201E8 005201E8 ..R...R...R...R.
0010:005201F0 005201F0 005201F0 005201F8 005201F8 ..R...R...R...R.
0010:00520200 00520200 00520200 00520208 00520208 ..R...R...R...R.
0010:00520210 00520210 00520210 00520218 00520218 ..R...R...R...R.
0010:00520220 00520220 00520220 00520228 00520228 .R. .R.(.R.(.R.
0010:00520230 00520230 00520230 00520238 00520238 0.R.0.R.8.R.8.R.
0010:00520240 00520240 00520240 00520248 00520248 @[email protected].
0010:00520250 00520250 00520250 00520258 00520258 P.R.P.R.X.R.X.R.
0010:00520260 00520260 00520260 00520268 00520268 `.R.`.R.h.R.h.R.
0010:00520270 00520270 00520270 00520278 00520278 p.R.p.R.x.R.x.R.
0010:00520280 00520280 00520280 00520288 00520288 ..R...R...R...R.
0010:00520290 00520290 00520290 00520298 00520298 ..R...R...R...R.
0010:005202A0 005202A0 005202A0 005202A8 005202A8 ..R...R...R...R.
0010:005202B0 005202B0 005202B0 005202B8 005202B8 ..R...R...R...R.
0010:005202C0 005202C0 005202C0 005202C8 005202C8 ..R...R...R...R.
0010:005202D0 005202D0 005202D0 005202D8 005202D8 ..R...R...R...R.
0010:005202E0 005202E0 005202E0 005202E8 005202E8 ..R...R...R...R.
0010:005202F0 005202F0 005202F0 005202F8 005202F8 ..R...R...R...R.
0010:00520300 00520300 00520300 00520308 00520308 ..R...R...R...R.
0010:00520310 00520310 00520310 00520318 00520318 ..R...R...R...R.
0010:00520320 00520320 00520320 00520328 00520328 .R. .R.(.R.(.R.
0010:00520330 00520330 00520330 00520338 00520338 0.R.0.R.8.R.8.R.
0010:00520340 00520340 00520340 00520348 00520348 @[email protected].
0010:00520350 00520350 00520350 00520358 00520358 P.R.P.R.X.R.X.R.
0010:00520360 00520360 00520360 00520368 00520368 `.R.`.R.h.R.h.R.
0010:00520370 00520370 00520370 00520378 00520378 p.R.p.R.x.R.x.R.
0010:00520380 00520380 00520380 00520388 00520388 ..R...R...R...R.
0010:00520390 00520390 00520390 00520398 00520398 ..R...R...R...R.
0010:005203A0 005203A0 005203A0 005203A8 005203A8 ..R...R...R...R.
0010:005203B0 005203B0 005203B0 005203B8 005203B8 ..R...R...R...R.
0010:005203C0 005203C0 005203C0 005203C8 005203C8 ..R...R...R...R.
0010:005203D0 005203D0 005203D0 005203D8 005203D8 ..R...R...R...R.
0010:005203E0 005203E0 005203E0 005203E8 005203E8 ..R...R...R...R.
0010:005203F0 005203F0 005203F0 005203F8 005203F8 ..R...R...R...R.
0010:00520400 00520400 00520400 00520408 00520408 ..R...R...R...R.
0010:00520410 00520410 00520410 00520418 00520418 ..R...R...R...R.
0010:00520420 00520420 00520420 00520428 00520428 .R. .R.(.R.(.R.
0010:00520430 00520430 00520430 00520438 00520438 0.R.0.R.8.R.8.R.
0010:00520440 00520440 00520440 00520448 00520448 @[email protected].
0010:00520450 00520450 00520450 00520458 00520458 P.R.P.R.X.R.X.R.
0010:00520460 00520460 00520460 00520468 00520468 `.R.`.R.h.R.h.R.
0010:00520470 00520470 00520470 00520478 00520478 p.R.p.R.x.R.x.R.
0010:00520480 00520480 00520480 00520488 00520488 ..R...R...R...R.
0010:00520490 00520490 00520490 00520498 00520498 ..R...R...R...R.
0010:005204A0 005204A0 005204A0 005204A8 005204A8 ..R...R...R...R.
0010:005204B0 005204B0 005204B0 005204B8 005204B8 ..R...R...R...R.
0010:005204C0 005204C0 005204C0 005204C8 005204C8 ..R...R...R...R.
0010:005204D0 005204D0 005204D0 005204D8 005204D8 ..R...R...R...R.
0010:005204E0 005204E0 005204E0 005204E8 005204E8 ..R...R...R...R.
0010:005204F0 005204F0 005204F0 005204F8 005204F8 ..R...R...R...R.
0010:00520500 00520500 00520500 00520508 00520508 ..R...R...R...R.
0010:00520510 00520510 00520510 00520518 00520518 ..R...R...R...R.
0010:00520520 00520520 00520520 00520528 00520528 .R. .R.(.R.(.R.
0010:00520530 00520530 00520530 00520538 00520538 0.R.0.R.8.R.8.R.
0010:00520540 00520540 00520540 00520548 00520548 @[email protected].
0010:00520550 00520550 00520550 00520558 00520558 P.R.P.R.X.R.X.R.
0010:00520560 00520560 00520560 00520568 00520568 `.R.`.R.h.R.h.R.
0010:00520570 00520570 00520570 00520608 00000000 p.R.p.R...R.....
0010:00520580 00000000 00000000 00000000 00521000 ..............R.
0010:00520590 0000F000 00000000 005205A8 00000000 ..........R.....
0010:005205A0 00000000 00000000 005205B8 00000000 ..........R.....
0010:005205B0 00000000 00000000 005205C8 00000000 ..........R.....
0010:005205C0 00000000 00000000 005205D8 00000000 ..........R.....
0010:005205D0 00000000 00000000 005205E8 00000000 ..........R.....
0010:005205E0 00000000 00000000 005205F8 00000000 ..........R.....
0010:005205F0 00000000 00000000 00000000 00000000 ................
0010:00520600 00000000 00000000 77FCD640 FFFFFFFF [email protected]....
0010:00520610 00000000 00000000 00000030 00000000 ........0.......
0010:00520620 00000000 00000000 00000000 00000000 ................
0010:00520630 00000000 00000000 00000000 00000000 ................
0010:00520640 00C80008 00000100 FFEEFFEE 00000000 ................
0010:00520650 00520000 0000F000 00520000 00000010 ..R.......R.....
0010:00520660 00520680 00530000 0000000F 00000001 ..R...S.........
0010:00520670 00520588 00000000 00520728 00000000 ..R.....(.R.....
0010:00520680 00080003 00080100 41414141 41414141 ........AAAAAAAA
0010:00520690 41414141 00000041 00030003 00080000 AAAAA...........
0010:005206A0 005206D0 00520190 41414141 00000041 ..R...R.AAAAA...
0010:005206B0 00030003 00080100 41414141 41414141 ........AAAAAAAA
0010:005206C0 41414141 00000041 00030003 00080000 AAAAA...........
0010:005206D0 00520700 005206A0 41414141 00000041 ..R...R.AAAAA...
0010:005206E0 00030003 00080100 41414141 41414141 ........AAAAAAAA
0010:005206F0 41414141 00000041 00030003 00080000 AAAAA...........
0010:00520700 00520190 005206D0 41414141 00000041 ..R...R.AAAAA...
0010:00520710 00030003 00080100 41414141 41414141 ........AAAAAAAA
0010:00520720 41414141 00000041 0003011B 00081000 AAAAA...........
0010:00520730 00520178 00520178 41414141 00000041 x.R.x.R.AAAAA...
0010:00520740 00030118 00001000 00520178 00520178 ........x.R.x.R.
0010:00520750 00000000 00000000 00000000 00000000 ................
0010:00520760 00000000 00000000 00000000 00000000 ................
0010:00520770 00000000 00000000 00000000 00000000 ................
0010:00520780 00000000 00000000 00000000 00000000 ................
0010:00520790 00000000 00000000 00000000 00000000 ................
0010:005207A0 00000000 00000000 00000000 00000000 ................
0010:005207B0 00000000 00000000 00000000 00000000 ................
0010:005207C0 00000000 00000000 00000000 00000000 ................
0010:005207D0 00000000 00000000 00000000 00000000 ................
0010:005207E0 00000000 00000000 00000000 00000000 ................
0010:005207F0 00000000 00000000 00000000 00000000 ................
0010:00520800 00000000 00000000 00000000 00000000 ................
0010:00520810 00000000 00000000 00000000 00000000 ................
0010:00520820 00000000 00000000 00000000 00000000 ................
0010:00520830 00000000 00000000 00000000 00000000 ................
0010:00520840 00000000 00000000 00000000 00000000 ................
0010:00520850 00000000 00000000 00000000 00000000 ................
0010:00520860 00000000 00000000 00000000 00000000 ................
0010:00520870 00000000 00000000 00000000 00000000 ................
0010:00520880 00000000 00000000 00000000 00000000 ................
0010:00520890 00000000 00000000 00000000 00000000 ................
0010:005208A0 00000000 00000000 00000000 00000000 ................
0010:005208B0 00000000 00000000 00000000 00000000 ................
0010:005208C0 00000000 00000000 00000000 00000000 ................
0010:005208D0 00000000 00000000 00000000 00000000 ................
0010:005208E0 00000000 00000000 00000000 00000000 ................
0010:005208F0 00000000 00000000 00000000 00000000 ................
0010:00520900 00000000 00000000 00000000 00000000 ................
0010:00520910 00000000 00000000 00000000 00000000 ................
0010:00520920 00000000 00000000 00000000 00000000 ................
0010:00520930 00000000 00000000 00000000 00000000 ................
0010:00520940 00000000 00000000 00000000 00000000 ................
0010:00520950 00000000 00000000 00000000 00000000 ................
0010:00520960 00000000 00000000 00000000 00000000 ................
0010:00520970 00000000 00000000 00000000 00000000 ................
0010:00520980 00000000 00000000 00000000 00000000 ................
0010:00520990 00000000 00000000 00000000 00000000 ................
0010:005209A0 00000000 00000000 00000000 00000000 ................
0010:005209B0 00000000 00000000 00000000 00000000 ................
0010:005209C0 00000000 00000000 00000000 00000000 ................
0010:005209D0 00000000 00000000 00000000 00000000 ................
0010:005209E0 00000000 00000000 00000000 00000000 ................
0010:005209F0 00000000 00000000 00000000 00000000 ................
0010:00520A00 00000000 00000000 00000000 00000000 ................
0010:00520A10 00000000 00000000 00000000 00000000 ................
0010:00520A20 00000000 00000000 00000000 00000000 ................
0010:00520A30 00000000 00000000 00000000 00000000 ................
0010:00520A40 00000000 00000000 00000000 00000000 ................
0010:00520A50 00000000 00000000 00000000 00000000 ................
0010:00520A60 00000000 00000000 00000000 00000000 ................
0010:00520A70 00000000 00000000 00000000 00000000 ................
0010:00520A80 00000000 00000000 00000000 00000000 ................
0010:00520A90 00000000 00000000 00000000 00000000 ................
0010:00520AA0 00000000 00000000 00000000 00000000 ................
0010:00520AB0 00000000 00000000 00000000 00000000 ................
0010:00520AC0 00000000 00000000 00000000 00000000 ................
0010:00520AD0 00000000 00000000 00000000 00000000 ................
0010:00520AE0 00000000 00000000 00000000 00000000 ................
0010:00520AF0 00000000 00000000 00000000 00000000 ................
0010:00520B00 00000000 00000000 00000000 00000000 ................
0010:00520B10 00000000 00000000 00000000 00000000 ................
0010:00520B20 00000000 00000000 00000000 00000000 ................
0010:00520B30 00000000 00000000 00000000 00000000 ................
0010:00520B40 00000000 00000000 00000000 00000000 ................
0010:00520B50 00000000 00000000 00000000 00000000 ................
0010:00520B60 00000000 00000000 00000000 00000000 ................
0010:00520B70 00000000 00000000 00000000 00000000 ................
0010:00520B80 00000000 00000000 00000000 00000000 ................
0010:00520B90 00000000 00000000 00000000 00000000 ................
0010:00520BA0 00000000 00000000 00000000 00000000 ................
0010:00520BB0 00000000 00000000 00000000 00000000 ................
0010:00520BC0 00000000 00000000 00000000 00000000 ................
0010:00520BD0 00000000 00000000 00000000 00000000 ................
0010:00520BE0 00000000 00000000 00000000 00000000 ................
0010:00520BF0 00000000 00000000 00000000 00000000 ................
0010:00520C00 00000000 00000000 00000000 00000000 ................
0010:00520C10 00000000 00000000 00000000 00000000 ................
0010:00520C20 00000000 00000000 00000000 00000000 ................
0010:00520C30 00000000 00000000 00000000 00000000 ................
0010:00520C40 00000000 00000000 00000000 00000000 ................
0010:00520C50 00000000 00000000 00000000 00000000 ................
0010:00520C60 00000000 00000000 00000000 00000000 ................
0010:00520C70 00000000 00000000 00000000 00000000 ................
0010:00520C80 00000000 00000000 00000000 00000000 ................
0010:00520C90 00000000 00000000 00000000 00000000 ................
0010:00520CA0 00000000 00000000 00000000 00000000 ................
0010:00520CB0 00000000 00000000 00000000 00000000 ................
0010:00520CC0 00000000 00000000 00000000 00000000 ................
0010:00520CD0 00000000 00000000 00000000 00000000 ................
0010:00520CE0 00000000 00000000 00000000 00000000 ................
0010:00520CF0 00000000 00000000 00000000 00000000 ................
0010:00520D00 00000000 00000000 00000000 00000000 ................
0010:00520D10 00000000 00000000 00000000 00000000 ................
0010:00520D20 00000000 00000000 00000000 00000000 ................
0010:00520D30 00000000 00000000 00000000 00000000 ................
0010:00520D40 00000000 00000000 00000000 00000000 ................
0010:00520D50 00000000 00000000 00000000 00000000 ................
0010:00520D60 00000000 00000000 00000000 00000000 ................
0010:00520D70 00000000 00000000 00000000 00000000 ................
0010:00520D80 00000000 00000000 00000000 00000000 ................
0010:00520D90 00000000 00000000 00000000 00000000 ................
0010:00520DA0 00000000 00000000 00000000 00000000 ................
0010:00520DB0 00000000 00000000 00000000 00000000 ................
0010:00520DC0 00000000 00000000 00000000 00000000 ................
0010:00520DD0 00000000 00000000 00000000 00000000 ................
0010:00520DE0 00000000 00000000 00000000 00000000 ................
0010:00520DF0 00000000 00000000 00000000 00000000 ................
0010:00520E00 00000000 00000000 00000000 00000000 ................
0010:00520E10 00000000 00000000 00000000 00000000 ................
0010:00520E20 00000000 00000000 00000000 00000000 ................
0010:00520E30 00000000 00000000 00000000 00000000 ................
0010:00520E40 00000000 00000000 00000000 00000000 ................
0010:00520E50 00000000 00000000 00000000 00000000 ................
0010:00520E60 00000000 00000000 00000000 00000000 ................
0010:00520E70 00000000 00000000 00000000 00000000 ................
0010:00520E80 00000000 00000000 00000000 00000000 ................
0010:00520E90 00000000 00000000 00000000 00000000 ................
0010:00520EA0 00000000 00000000 00000000 00000000 ................
0010:00520EB0 00000000 00000000 00000000 00000000 ................
0010:00520EC0 00000000 00000000 00000000 00000000 ................
0010:00520ED0 00000000 00000000 00000000 00000000 ................
0010:00520EE0 00000000 00000000 00000000 00000000 ................
0010:00520EF0 00000000 00000000 00000000 00000000 ................
0010:00520F00 00000000 00000000 00000000 00000000 ................
0010:00520F10 00000000 00000000 00000000 00000000 ................
0010:00520F20 00000000 00000000 00000000 00000000 ................
0010:00520F30 00000000 00000000 00000000 00000000 ................
0010:00520F40 00000000 00000000 00000000 00000000 ................
0010:00520F50 00000000 00000000 00000000 00000000 ................
0010:00520F60 00000000 00000000 00000000 00000000 ................
0010:00520F70 00000000 00000000 00000000 00000000 ................
0010:00520F80 00000000 00000000 00000000 00000000 ................
0010:00520F90 00000000 00000000 00000000 00000000 ................
0010:00520FA0 00000000 00000000 00000000 00000000 ................
0010:00520FB0 00000000 00000000 00000000 00000000 ................
0010:00520FC0 00000000 00000000 00000000 00000000 ................
0010:00520FD0 00000000 00000000 00000000 00000000 ................
0010:00520FE0 00000000 00000000 00000000 00000000 ................
0010:00520FF0 00000000 00000000 00000000 00000000 ................

整個堆可以分爲兩部分,首先是一個巨大的Header,從00520000一直到00520680(這麼說是因爲從00520680開始處就已經是用來動態申請和釋放的內存和它的結構了,這樣分並不一定正確),最開始的部分是各種信息吧。從00520178開始是一個很大的結構數組,這個結構數組大約有128個數組元素。每個數組元素長8個字節,是一個結構。這個結構由兩部分組成。可以這樣定義它:

struct _free_memory_link_node
{
_free_memory_link_node* pNextFreeMemLinkNode;
_free_memory_link_node* pPrevFreeMemLinkNode;
};
這個結構由2個指針組成,用來指向空閒的內存塊。後面會有更詳細的描述。這128個這種結構,是用來指向128種不同大小範圍的空閒內存塊,以加速尋找。這個很大的結構數組之後,又是些不知道是什麼的東西。頭部就是這些。

接着是用於動態申請和釋放的內存部分了,這些內存有兩種結構,

第一種,是被分配使用的,

+-----------------------------------------------------------+ 
| 8 byte   |                buf                             | 
+-----------------------------------------------------------+ 
|信息和標誌 |                用戶內存                        |

首先是8個字節的信息和標誌,具體內容不明。之後的內存就是HeapAlloc返回的內存地址。

第二種,是空閒的內存,

+-----------------------------------------------------------+ 
| 8 bytes  |  8 bytes  |     buf                            | 
+-----------------------------------------------------------+ 
|信息和標誌 | 雙指針結構 |    用戶內存                        |

首先仍是8個字節的信息和標誌,(很有可能有標誌表明是否空閒,我看到很象,但還不確定)
接着是8個字節的雙指針結構,就是前面所說的 _free_memory_link_node 結構。注意的是後面的內存如果是被釋放的,裏面的內容並沒有被清零,不要被迷惑。每個空閒的內存根據它的大小會和Heap Header 中的空閒鏈表頭所開始的一個鏈表連在一起,這是一個雙向循環鏈表,根據上面所給的第二次getch()後softice中的內容,可以很容易構造出這個鏈表來。太費時間了,我就不配插圖了。當 Heap Header 中的某個空閒塊大小範圍的空閒鏈表頭的那個節點的兩個指針指向自己時,說明這個這個大小範圍的空閒塊爲0。這也就是爲什麼剛開始我們看到大片大片的兩個指針,指向自己的8個字節,只因爲剛開始還是一整塊空閒內存,沒有什麼小塊的空閒內存,各個範圍的鏈表都沒有節點。

空閒塊是需要使用鏈表連起來的,這樣才能找到每個空閒塊,以用來再申請的時候使用。可以估計到,每次釋放一個內存塊時,系統(這麼叫合適嗎?)還需要判斷是否適合臨近的空閒塊緊挨着,如果是的話,會進行合併。釋放時系統還需要根據大小把這個空閒塊插入相應大小範圍的雙向鏈表中的合適位置。使用的內存塊兒是不需要指針鏈接起來的,因爲他們在分配時給程序返回了地址,程序使用這個地址的內存。沒有理由要把他們鏈接起來。從中我們也可以看出,堆上的內存的一些必要的處理確實比較麻煩,會導致相對較慢。

再看一下那128個鏈表,各自的空閒塊的大小範圍吧。

爲了測試不同大小範圍的空閒塊,會鏈接到128箇中的哪個鏈表上,我寫了下面的小程序。

程序的原理我就不解釋了,你輸入指定大小,程序申請,並釋放這個大小的內存塊,形成一個這個大小的空閒內存塊,然後根據結構的位置,得到指針,然後看指向何處。

#include <windows.h> 
#include <stdio.h> 
#include <conio.h>

void main()
{
Start:
HANDLE hHeap;

hHeap=HeapCreate(NULL,0x1000,0x10000); 

int size;
printf("Type HeapAlloc Size (HEX): ");
scanf("%x",&size);
printf("/nSize (HEX): %x Byte/n",size);

printf("/n(%x-1)/8 *8= %08x/n",size,((size-1)/8*8));

char * buf1,*buf2;

buf1 = (char*)HeapAlloc(hHeap, 0, size); 

buf2 = (char*)HeapAlloc(hHeap, 0, 16);

HeapFree(hHeap, 0, buf1);

int* addr;
addr = (int*)buf1;
printf("Pointer: %08x/n",*addr);

HeapFree(hHeap, 0, buf2);

HeapDestroy(hHeap);

printf("/n/n");

goto Start;

}

經過測試,釋放1-8個字節形成的空閒內存塊,指向 00520188 所開始的那個雙向鏈表。
9-16個字節的空閒內存塊,指向 00520190,17-24個字節的空閒內存塊,指向 00520198,
25-32個字節的空閒內存塊,指向 005201a0...依此類推,每個都是8個字節的範圍,
直到0x3e9-0x3f0(1001-1008)個字節的空閒內存塊。0x3e9-0x3f0 指向 00520570。
符合這一規則(8個字節一個範圍段)的從1-8開始直到1001-1008,共126項。
凡是超過1008個字節的空閒內存塊,將鏈接到一個特殊的雙向鏈表,這個雙向鏈表的開始在 00520178。也就剛開始就會注意到的一個地址。(只因爲剛開始一大塊的時候,超過了1008個字節)。這樣就有127項我們知道這個雙向鏈表所鏈內存的大小範圍了。還有一個00520180處的沒有仔細觀察。

還有要說的一點就是,比如你申請了5個字節的內存,那麼系統會給你8個字節的內存,比如你放AAAAA,那麼實際放了AAAA A000 ,這樣做的理由是我們使用的是32bit cpu 以4個字節爲單位是有理由的。但是根據前面的8個字節的範圍,會不會是以8個字節爲單位使用內存,我沒去試,這個並不難,設計個小試驗吧。

基本就是這些了。

    第四 還有很多工作沒有做

    本文只是大概介紹了堆中的一些結構,還有很多東西可以去試。設計一些試驗,來了解各種結構中的內容和它的意義。比如設計試驗測試哪些是標誌位,以及不同值表示的含義,這個試驗就很容易設計。 對堆如果有什麼更多的瞭解,請您受累也告訴我,salute。

    關於Win2k堆的實現和裏面的數據結構,沒有任何的官方描述(差不多可以這麼說吧),非官方的東西也只要幾篇關於堆溢出的文章提到了一點,還充滿了錯誤(差不錯可以這麼說吧)。本文通過分析,試驗和猜測,來獲得知識,同樣可能充滿了錯誤,大家多保重。我最近在學習Windows系統,如果有哪位有興趣,有時間,也有能力的話非常非常歡迎和我聯繫,或許能互相幫助。本文只是半成品,很多地方沒有力求詳盡,也非常非常歡迎大家對本文進行補充,設計更多的測試,對於堆有更多的瞭解,一定也告訴我。發現錯誤也一定告訴我,歡迎大家指導,多謝觀賞。

歡迎大家來這裏看看 http://jiurl.cosoft.org.cn/forum/ http://jiurl.yeah.net/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章