亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? heap.cpp

?? 小型的操作系統(tǒng)開發(fā)的原代碼
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//***********************************************************************/
//    Author                    : Garry
//    Original Date             : May,20 2006
//    Module Name               : HEAP.CPP
//    Module Funciton           : 
//                                This module countains Heap's implementation code.
//    Last modified Author      :
//    Last modified Date        :
//    Last modified Content     :
//                                1.
//                                2.
//    Lines number              :
//***********************************************************************/

#ifndef __STDAFX_H__
#include "..\INCLUDE\StdAfx.h"
#endif

//#ifndef __HEAP_H__
//#include "HEAP.H"
//#endif

//
//The implementation of CreateHeap routine.
//This routine does the following:
// 1. Allocate a virtual area according to dwInitSize;
// 3. Create a virtual area node object,to manage the virtual area;
// 2. Create a heap object,and initialize it;
// 4. Insert the virtual area node into heap's virtual area node list;
// 5. Insert the virtual area into heap object's free list;
// 6. Insert the heap object into kernel thread's list;
// 7. If all successful,return the help object's base address.
//
static __HEAP_OBJECT* CreateHeap(DWORD dwInitSize)
{
	__HEAP_OBJECT*              lpHeapObject   = NULL;
	__HEAP_OBJECT*              lpHeapRoot     = NULL;
	__VIRTUAL_AREA_NODE*        lpVirtualArea  = NULL;
	__FREE_BLOCK_HEADER*        lpFreeHeader   = NULL;
	LPVOID                      lpVirtualAddr  = NULL;
	BOOL                        bResult        = FALSE;
	DWORD                       dwFlags        = 0;

	if(dwInitSize > MAX_VIRTUAL_AREA_SIZE)  //Requested size too big.
		return NULL;
	if(dwInitSize < DEFAULT_VIRTUAL_AREA_SIZE)
		dwInitSize = DEFAULT_VIRTUAL_AREA_SIZE;

	//
	//Now,allocate the virtual area.
	//
	lpVirtualAddr = GET_VIRTUAL_AREA(dwInitSize);
	if(NULL == lpVirtualAddr)   //Can not get virtual area.
		goto __TERMINAL;
	lpFreeHeader = (__FREE_BLOCK_HEADER*)lpVirtualAddr;
	lpFreeHeader->dwFlags     = BLOCK_FLAGS_FREE;
	lpFreeHeader->dwBlockSize = dwInitSize - sizeof(__FREE_BLOCK_HEADER); //Caution!!!

	//
	//Now,create a virtual area node object,to manage virtual area.
	//
	lpVirtualArea = (__VIRTUAL_AREA_NODE*)GET_KERNEL_MEMORY(
		sizeof(__VIRTUAL_AREA_NODE));
	if(NULL == lpVirtualArea)  //Can not get memory.
		goto __TERMINAL;
	lpVirtualArea->lpStartAddress = lpVirtualAddr;
	lpVirtualArea->dwAreaSize     = dwInitSize;
	lpVirtualArea->lpNext         = NULL;

	//
	//Now,create a heap object,and initialize it.
	//
	lpHeapObject = (__HEAP_OBJECT*)GET_KERNEL_MEMORY(sizeof(__HEAP_OBJECT));
	if(NULL == lpHeapObject)  //Can not allocate memory.
		goto __TERMINAL;
	lpHeapObject->lpVirtualArea               = lpVirtualArea;  //Virtual area node list.
	lpHeapObject->FreeBlockHeader.dwFlags     |= BLOCK_FLAGS_FREE;
	lpHeapObject->FreeBlockHeader.dwFlags     &= ~BLOCK_FLAGS_USED;
	lpHeapObject->FreeBlockHeader.dwBlockSize = 0;
	lpHeapObject->lpPrev                      = lpHeapObject; //Pointing to itself.
	lpHeapObject->lpNext                      = lpHeapObject; //Pointing to itself.

	__ENTER_CRITICAL_SECTION(NULL,dwFlags);  //Critical section here.
	lpHeapObject->lpKernelThread        = CURRENT_KERNEL_THREAD;
	lpHeapRoot = (__HEAP_OBJECT*)CURRENT_KERNEL_THREAD->lpHeapObject;
	if(NULL == lpHeapRoot)  //Has not any heap yet.
	{
		CURRENT_KERNEL_THREAD->lpHeapObject = (LPVOID)lpHeapObject;
	}
	else  //Has at least one heap object,so insert it into the list.
	{
		lpHeapObject->lpPrev = lpHeapRoot->lpPrev;
		lpHeapObject->lpNext = lpHeapRoot;
		lpHeapObject->lpNext->lpPrev = lpHeapObject;
		lpHeapObject->lpPrev->lpNext = lpHeapObject;
	}
	__LEAVE_CRITICAL_SECTION(NULL,dwFlags);

	//
	//Now,add the virtual area into the heap object's free list.
	//
	lpFreeHeader->lpPrev = &(lpHeapObject->FreeBlockHeader);
	lpFreeHeader->lpNext = &(lpHeapObject->FreeBlockHeader);
	lpHeapObject->FreeBlockHeader.lpPrev      = lpFreeHeader;
	lpHeapObject->FreeBlockHeader.lpNext      = lpFreeHeader;

	bResult = TRUE;    //The whole operation is successful.

__TERMINAL:
	if(!bResult)    //Failed.
	{
		if(lpVirtualAddr)  //Should release it.
			RELEASE_VIRTUAL_AREA(lpVirtualAddr);
		if(lpHeapObject)
			RELEASE_KERNEL_MEMORY((LPVOID)lpHeapObject);
		if(lpVirtualArea)
			RELEASE_KERNEL_MEMORY((LPVOID)lpVirtualArea);
		lpHeapObject = NULL;  //Should return a NULL flags.
	}

	return lpHeapObject;
}

//
//The implementation of DestroyHeap routine.
//This routine does the following:
// 1. Delete the heap object from kernel thread's heap list;
// 2. Release all virtual areas belong to this heap;
// 3. Release the virtual area list;
// 4. Release the heap object itself.
//
static VOID DestroyHeap(__HEAP_OBJECT* lpHeapObject)
{
	__VIRTUAL_AREA_NODE*       lpVirtualArea  = NULL;
	__VIRTUAL_AREA_NODE*       lpVirtualTmp   = NULL;
	LPVOID                     lpVirtualAddr  = NULL;
	DWORD                      dwFlags        = 0L;

	if(NULL == lpHeapObject)  //Parameter check.
		return;

	if(lpHeapObject == lpHeapObject->lpNext)  //Only one heap object in current thread.
	{
		__ENTER_CRITICAL_SECTION(NULL,dwFlags);
		lpHeapObject->lpKernelThread->lpHeapObject = NULL;
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
	}
	else  //Delete itself from the kernel thread's heap list.
	{
		__ENTER_CRITICAL_SECTION(NULL,dwFlags);
		if(lpHeapObject->lpKernelThread->lpHeapObject == lpHeapObject)
		{
			lpHeapObject->lpKernelThread->lpHeapObject = (LPVOID)lpHeapObject->lpNext;
		}
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);

		lpHeapObject->lpPrev->lpNext = lpHeapObject->lpNext;
		lpHeapObject->lpNext->lpPrev = lpHeapObject->lpPrev;
	}

	lpVirtualArea = lpHeapObject->lpVirtualArea;
	while(lpVirtualArea)
	{
		lpVirtualTmp = lpVirtualArea;
		lpVirtualArea = lpVirtualArea->lpNext;
		RELEASE_VIRTUAL_AREA(lpVirtualTmp->lpStartAddress);  //Release the virtual area.
		RELEASE_KERNEL_MEMORY((LPVOID)lpVirtualTmp);
	}

	//
	//Now,should release the heap object itself.
	//
	RELEASE_KERNEL_MEMORY((LPVOID)lpHeapObject);

	return;
}

//
//DestroyAllHeap's implementation.
//This routine destroys all heaps of the current kernel thread.
//
static VOID DestroyAllHeap()
{
	__HEAP_OBJECT*       lpHeapObj1 = NULL;
	__HEAP_OBJECT*       lpHeapObj2 = NULL;
	__HEAP_OBJECT*       lpHeapRoot = NULL;

	lpHeapRoot = (__HEAP_OBJECT*)CURRENT_KERNEL_THREAD->lpHeapObject;
	if(NULL == lpHeapRoot)  //Not any heap object.
		return;
	lpHeapObj1 = lpHeapRoot->lpNext;
	while(lpHeapRoot != lpHeapObj1)
	{
		lpHeapObj2 = lpHeapObj1->lpNext;
		DestroyHeap(lpHeapObj1);
		lpHeapObj1 = lpHeapObj2;
	}
	DestroyHeap(lpHeapRoot);  //Destroy the root heap.
}

//
//The following is a help routine,used to print out the heap information of
//a kernel thread.
//
VOID PrintHeapInfo(__KERNEL_THREAD_OBJECT* lpKernelThread)
{
	__HEAP_OBJECT*   lpHeapObject = NULL;
	__HEAP_OBJECT*   lpHeapTmp    = NULL;
	DWORD            dwFlags      = 0L;
	__VIRTUAL_AREA_NODE*  lpVirtualArea = NULL;

	if(NULL == lpKernelThread)  //Parameter check.
		return;

	__ENTER_CRITICAL_SECTION(NULL,dwFlags);
	lpHeapObject = (__HEAP_OBJECT*)lpKernelThread->lpHeapObject;
	__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
	
	//printf("Start to print out the heap information.\r\n");
	lpHeapTmp = lpHeapObject;
	while(lpHeapTmp)
	{
		//printf("Begin a heap.......\r\n");
		lpVirtualArea = lpHeapTmp->lpVirtualArea;
		while(lpVirtualArea)
		{
			//printf("Start address is : %X\r\n",lpVirtualArea->lpStartAddress);
			lpVirtualArea = lpVirtualArea->lpNext;
		}
		lpHeapTmp = lpHeapTmp->lpNext;
		if(lpHeapObject == lpHeapTmp)  //The same heap object.
			break;
	}
}

//
//The following routine is a help routine,used to dumpout the free block list.
//
VOID DumpFreeList(__HEAP_OBJECT* lpHeapObj)
{
	__FREE_BLOCK_HEADER	*        lpFreeHeader = NULL;

	if(NULL == lpHeapObj)  //Invalid parameter
		return;
	//printf("\r\nBegin to dump out the free list:\r\n");
	lpFreeHeader = lpHeapObj->FreeBlockHeader.lpNext;
	while(lpFreeHeader != &lpHeapObj->FreeBlockHeader)
	{
		//printf("StartAddr: 0x%8X Size: %d\r\n",
		//	(DWORD)lpFreeHeader + sizeof(__FREE_BLOCK_HEADER),
		//	lpFreeHeader->dwBlockSize);
		lpFreeHeader = lpFreeHeader->lpNext;
	}
}

//
//The implementation of HeapAlloc routine.
//This routine does the following actions:
// 1. Check if the heap object given by user belong to current kernel thread,
//    that is,only the thread that heap object belong to can allocate memory
//    from it;
// 2. Check the free list of the heap,try to find a free block can statisfy
//    user's request;
// 3. If can find the block,then split the block in case of the block size is
//    big,and return one to user,or return the whole block to user in case of
//    the block is not too big;
// 4. If can not find the block,then allocate a virtual area according to user's
//    request,and split the virtual area,one part returned to user,insert another
//    part into free list;
// 5. If any failure,returns NULL to indicate failed.
//
static LPVOID HeapAlloc(__HEAP_OBJECT* lpHeapObject,DWORD dwSize)
{
	__VIRTUAL_AREA_NODE*             lpVirtualArea   = NULL;
	__FREE_BLOCK_HEADER*             lpFreeBlock     = NULL;
	__FREE_BLOCK_HEADER*             lpTmpHeader     = NULL;
	LPVOID                           lpResult        = NULL;
	DWORD                            dwFlags         = 0L;
	DWORD                            dwFindSize      = 0L;

	if((NULL == lpHeapObject) || (0 == dwSize)) //Parameter check.
		return lpResult;
	
	__ENTER_CRITICAL_SECTION(NULL,dwFlags);
	if(lpHeapObject->lpKernelThread != CURRENT_KERNEL_THREAD) //Check the heap's owner.
	{
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		return lpResult;
	}
	__LEAVE_CRITICAL_SECTION(NULL,dwFlags);

	if(dwSize < MIN_BLOCK_SIZE)
		dwSize = MIN_BLOCK_SIZE;
	dwFindSize = dwSize + MIN_BLOCK_SIZE + sizeof(__FREE_BLOCK_HEADER);

	//
	//Now,check the free list,try to find a free block.
	//
	lpFreeBlock = lpHeapObject->FreeBlockHeader.lpNext;
	while(lpFreeBlock != &lpHeapObject->FreeBlockHeader)
	{
		if(lpFreeBlock->dwBlockSize >= dwSize)  //Find one.
		{
			if(lpFreeBlock->dwBlockSize >= dwFindSize)  //Should split it into two free blocks.
			{
				lpTmpHeader = (__FREE_BLOCK_HEADER*)((DWORD)lpFreeBlock + dwSize
					+ sizeof(__FREE_BLOCK_HEADER));     //Pointing to second part.
				lpTmpHeader->dwFlags     = BLOCK_FLAGS_FREE;
				lpTmpHeader->dwBlockSize = lpFreeBlock->dwBlockSize - dwSize
					- sizeof(__FREE_BLOCK_HEADER);      //Calculate second part's size.
				//
				//Now,should replace the lpFreeBlock with lpTmpHeader.
				//

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品福利在线| 三级一区在线视频先锋| 精品国产乱码久久久久久影片| 色哟哟欧美精品| 一本色道久久综合狠狠躁的推荐| eeuss鲁片一区二区三区| 成人高清视频免费观看| 91视频免费播放| 日本高清不卡在线观看| 欧美日韩三级视频| 欧美一级生活片| 2024国产精品视频| 久久精品一二三| 国产精品久久精品日日| 一二三四社区欧美黄| 亚洲成av人片一区二区梦乃| 蜜臀99久久精品久久久久久软件| 极品少妇xxxx偷拍精品少妇| 国产九九视频一区二区三区| 不卡免费追剧大全电视剧网站| 色av综合在线| 日韩视频一区二区在线观看| 国产无一区二区| 亚洲综合一区二区| 日韩精品福利网| 国产91精品久久久久久久网曝门 | 8x福利精品第一导航| 日韩西西人体444www| 国产片一区二区| 曰韩精品一区二区| 免费国产亚洲视频| av男人天堂一区| 欧美三区在线视频| 日韩美一区二区三区| 在线不卡一区二区| 久久久一区二区三区| 国产精品久久久久影院老司| 五月天久久比比资源色| 国内精品免费**视频| 欧美亚洲国产bt| 久久久久免费观看| 午夜日韩在线电影| 成人三级伦理片| 日韩欧美一区二区视频| 亚洲欧美另类小说视频| 美女网站视频久久| 日韩高清中文字幕一区| 精品一区二区三区免费观看| 在线一区二区观看| 国产精品久久久久久久久免费樱桃 | 亚洲特级片在线| 精品中文字幕一区二区小辣椒| 欧美中文字幕不卡| 日韩精品一区二区三区中文精品| 精品福利在线导航| 日本一区中文字幕| 91免费国产视频网站| 久久久99精品久久| 韩国欧美国产一区| 欧美电影免费观看完整版 | 9人人澡人人爽人人精品| 日韩欧美三级在线| 日韩精品欧美成人高清一区二区| 色婷婷综合视频在线观看| 精品国产3级a| 国产美女在线观看一区| 99久久久久免费精品国产| 7777精品伊人久久久大香线蕉完整版| 久久精品这里都是精品| 国产乱理伦片在线观看夜一区| 欧美日韩免费视频| 亚洲成av人在线观看| 欧美性色黄大片| 亚洲五月六月丁香激情| 欧美日韩精品欧美日韩精品一综合| 亚洲日韩欧美一区二区在线| 色综合天天在线| 亚洲一区在线电影| 欧美三级三级三级| 日精品一区二区三区| 91精品国产综合久久福利软件| 日韩高清一区在线| 91精品国产入口在线| 蜜臀av一区二区在线观看| 日韩欧美高清在线| 国产精品18久久久久久vr| 国产亚洲一区字幕| 成人v精品蜜桃久久一区| 中文字幕字幕中文在线中不卡视频| 99国产精品久久久久久久久久 | 欧美精品日韩精品| 蜜臀91精品一区二区三区| 精品久久久久99| 成人综合婷婷国产精品久久| 自拍偷自拍亚洲精品播放| 欧美亚洲动漫制服丝袜| 麻豆久久一区二区| 国产精品久久免费看| 欧美中文字幕不卡| 国模一区二区三区白浆| 久久久欧美精品sm网站| 色综合天天综合网国产成人综合天| 亚洲一区电影777| 欧美成人艳星乳罩| 91麻豆蜜桃一区二区三区| 日本欧美一区二区在线观看| 欧美激情一区二区在线| 欧美色图一区二区三区| 国产精品综合网| 一区二区日韩av| 久久免费午夜影院| 欧美性猛交xxxxxxxx| 国产一区二区免费看| 亚洲黄色小说网站| 欧美亚洲一区二区在线观看| 国产一区欧美一区| 亚洲成人tv网| 国产精品福利一区二区三区| 欧美一区二区播放| 色综合亚洲欧洲| 成人手机在线视频| 久久99国产精品久久99| 依依成人综合视频| 国产亚洲一区二区在线观看| 欧美片网站yy| 日本电影欧美片| 精品一区二区三区视频在线观看| 亚洲乱码中文字幕综合| 欧美激情一区在线观看| 26uuu欧美日本| 日韩一本二本av| 欧美日韩成人一区二区| 91国产成人在线| 99久久婷婷国产| 成人黄色av电影| 国产成a人无v码亚洲福利| 美国一区二区三区在线播放| 亚洲成av人片在www色猫咪| 中文欧美字幕免费| 欧美一级二级在线观看| 911国产精品| 91麻豆精品国产91久久久| 欧美在线影院一区二区| 91日韩一区二区三区| 97久久精品人人爽人人爽蜜臀| 国产精品一二三在| 国产馆精品极品| 国产不卡在线一区| 成人福利视频在线看| 国产91色综合久久免费分享| 高清不卡一区二区在线| 韩国理伦片一区二区三区在线播放| 亚洲va韩国va欧美va精品| 亚洲国产精品久久不卡毛片| 亚洲一区二区在线播放相泽| 亚洲一区二区3| 日本午夜精品视频在线观看| 蜜桃在线一区二区三区| 精品一区二区免费视频| 国产一区二区三区综合| 高清久久久久久| 99久久伊人久久99| 欧美日韩亚洲综合在线| 欧美一级高清片在线观看| 日韩一区和二区| 精品国产三级a在线观看| 国产亚洲欧洲一区高清在线观看| 国产欧美日韩不卡| 亚洲美女一区二区三区| 天天综合网 天天综合色| 日本中文在线一区| 成人美女在线观看| 欧美性猛交xxxx乱大交退制版| 在线播放欧美女士性生活| 精品久久久久久最新网址| 中文字幕国产一区| 亚洲成av人综合在线观看| 精品在线观看视频| 国产麻豆日韩欧美久久| 91碰在线视频| 欧美三级韩国三级日本三斤| 26uuu久久综合| 亚洲久本草在线中文字幕| 美日韩黄色大片| 91亚洲精品一区二区乱码| 91精品国产综合久久久久| 欧美国产激情一区二区三区蜜月| 一区二区三区在线免费播放| 精品综合免费视频观看| 99re这里只有精品首页| 欧美成人精品1314www| 亚洲乱码国产乱码精品精小说| 男人的天堂久久精品| 91麻豆精品视频| 久久精品亚洲麻豆av一区二区| 久久国产精品区| 99精品久久免费看蜜臀剧情介绍| 欧美不卡一区二区三区| 亚洲美女一区二区三区| 久草热8精品视频在线观看|