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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? heap.cpp

?? 小型的操作系統開發的原代碼
?? 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 "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一区二区三区免费野_久草精品视频
日韩免费一区二区| 69久久99精品久久久久婷婷 | 国产精品一区二区久久精品爱涩| 亚洲一区二区三区中文字幕| 亚洲免费观看高清| 亚洲综合男人的天堂| 午夜伊人狠狠久久| 麻豆高清免费国产一区| 久久99国产精品免费| 国产精品69毛片高清亚洲| 国产成人一级电影| 91小视频在线观看| 欧美日韩精品三区| 日韩欧美一级精品久久| 久久久亚洲欧洲日产国码αv| 国产亚洲视频系列| 亚洲精品老司机| 午夜免费久久看| 麻豆精品一区二区综合av| 激情文学综合丁香| 99国产精品久久久久久久久久| 色婷婷精品久久二区二区蜜臂av | 日韩三级精品电影久久久 | 91成人看片片| 日韩一级免费观看| 亚洲国产精品二十页| 亚洲精品日产精品乱码不卡| 奇米影视7777精品一区二区| 自拍偷拍国产精品| 精品无码三级在线观看视频| 国产一区二区网址| 不卡一区二区三区四区| 欧美男同性恋视频网站| 国产欧美日韩亚州综合| 亚洲国产日韩一区二区| 国产真实乱偷精品视频免| 色婷婷狠狠综合| 国产亚洲欧美激情| 亚洲欧美aⅴ...| 美国毛片一区二区三区| 91福利国产成人精品照片| 久久蜜桃av一区二区天堂| 亚洲一区二区三区四区五区黄| 国产一区二区三区在线观看精品| 欧美在线免费播放| 中文字幕成人在线观看| 热久久久久久久| 色婷婷综合久久久久中文一区二区| 欧美mv日韩mv| 亚洲国产精品精华液网站| 成人午夜私人影院| www欧美成人18+| 爽好多水快深点欧美视频| 99热在这里有精品免费| 久久综合九色综合97婷婷| 性久久久久久久久久久久| 99久久综合色| 国产午夜精品美女毛片视频| 日日摸夜夜添夜夜添精品视频| 99久久精品免费看| 精品国内片67194| 石原莉奈在线亚洲三区| 欧美日韩中字一区| 亚洲制服丝袜在线| 欧美性欧美巨大黑白大战| 国产精品久久综合| 成人免费福利片| 久久久国产一区二区三区四区小说 | 久久久久9999亚洲精品| 蜜乳av一区二区三区| 欧美精品日日鲁夜夜添| 亚洲一区免费视频| 波多野结衣亚洲| 欧美国产一区在线| 99久久国产综合精品色伊| 亚洲视频一区二区在线| 一本到一区二区三区| 亚洲免费观看在线视频| 色狠狠色噜噜噜综合网| 亚洲制服欧美中文字幕中文字幕| 一本色道久久综合亚洲aⅴ蜜桃 | youjizz久久| 中文字幕一区二区三区在线不卡 | 青青草原综合久久大伊人精品| 欧美性一二三区| 日韩精品电影在线| 日韩欧美成人一区二区| 国产一区二区三区视频在线播放| 久久精品夜色噜噜亚洲aⅴ| 国产成人av一区| 亚洲桃色在线一区| 制服丝袜中文字幕一区| 日本不卡一区二区三区高清视频| 日韩一区二区三区视频在线观看| 韩国视频一区二区| 亚洲视频资源在线| 欧美日韩高清在线播放| 国产一区二区在线电影| 亚洲欧美国产高清| 日韩欧美在线123| 粉嫩av一区二区三区在线播放 | 国产精品久久久久毛片软件| 色屁屁一区二区| 久久av老司机精品网站导航| 国产精品欧美一区喷水| 欧美日韩高清一区二区三区| 九色porny丨国产精品| 国产精品传媒在线| 7777精品久久久大香线蕉| 国产精品正在播放| 亚洲观看高清完整版在线观看| 欧美mv和日韩mv的网站| 91麻豆国产香蕉久久精品| 日韩福利视频网| 中文字幕亚洲一区二区av在线 | 男男gaygay亚洲| 国产精品福利一区二区| 日韩女优毛片在线| 色综合天天做天天爱| 久草精品在线观看| 一区二区三区日韩在线观看| 26uuu久久综合| 91麻豆精品国产91久久久久久久久| 国产精一区二区三区| 日韩黄色一级片| 亚洲日本va午夜在线电影| 久久夜色精品一区| 88在线观看91蜜桃国自产| 99精品黄色片免费大全| 国产成人在线视频网站| 蜜臀精品一区二区三区在线观看 | 国产日韩精品一区二区三区| 欧美二区乱c少妇| 色琪琪一区二区三区亚洲区| 国产·精品毛片| 久久国产夜色精品鲁鲁99| 三级欧美在线一区| 亚洲福利一区二区三区| 一区二区三区鲁丝不卡| 欧美国产日产图区| 精品国产露脸精彩对白 | 国产精品久久久久久久久免费桃花| 欧美一二三区在线| 欧美一区二区视频在线观看2020| 一本一本大道香蕉久在线精品| 不卡一卡二卡三乱码免费网站| 国产成人免费视频| 国产一区二区剧情av在线| 久久99国内精品| 国产一区美女在线| 国产一区二区三区四区在线观看 | 亚洲三级视频在线观看| 国产精品三级在线观看| 中文字幕乱码一区二区免费| 欧美国产精品中文字幕| 中文字幕国产精品一区二区| 欧美国产激情一区二区三区蜜月| 国产女同性恋一区二区| 2023国产精品自拍| 中文久久乱码一区二区| 综合久久一区二区三区| 椎名由奈av一区二区三区| 一区二区在线电影| 亚洲国产欧美日韩另类综合| 亚洲电影中文字幕在线观看| 香蕉久久夜色精品国产使用方法| 午夜精品久久久久| 麻豆一区二区在线| 丁香天五香天堂综合| av一区二区三区| 日本韩国视频一区二区| 欧美顶级少妇做爰| 国产午夜精品一区二区三区视频| |精品福利一区二区三区| 亚洲自拍另类综合| 久久精品72免费观看| 成人一区二区三区视频| 91美女在线观看| 91精品国产综合久久福利软件| 26uuu国产在线精品一区二区| 国产精品美女久久久久高潮| 亚洲精品中文字幕在线观看| 美国欧美日韩国产在线播放| 成人免费高清在线观看| 欧美日韩国产bt| 日本一区二区成人在线| 丝袜脚交一区二区| 风间由美性色一区二区三区| 欧美日韩高清不卡| 中文在线资源观看网站视频免费不卡 | 国产乱码一区二区三区| 成人av影院在线| 欧美一级日韩免费不卡| 国产精品天美传媒| 蜜臀av性久久久久蜜臀aⅴ| 一本一道久久a久久精品| 日韩精品一区二区三区视频播放| 国产精品白丝在线| 国内精品久久久久影院一蜜桃| 色综合久久久久综合体桃花网|