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

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

?? objmgr.cpp

?? 小型的操作系統開發的原代碼
?? CPP
字號:
//***********************************************************************/
//    Author                    : Garry
//    Original Date             : Sep,03 2004
//    Module Name               : objmgr.cpp
//    Module Funciton           : 
//                                This module countains Object manager code.
//    Last modified Author      :
//    Last modified Date        :
//    Last modified Content     :
//                                1.
//                                2.
//    Lines number              :
//***********************************************************************/

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

//
//The following array is used by Object Manager to create object.
//Once a new object type is defined,you must add one line in the
//following array using OBJECT_INIT_DATA,it's parameters meaning,
//please refer commobj.h.
//

BEGIN_DECLARE_INIT_DATA(ObjectInitData)
    //OBJECT_INIT_DATA(0,0,0,0)
	//OBJECT_INIT_DATA(0,0,0,0)
	// Please add your new defined object's initialization data here.
	OBJECT_INIT_DATA(OBJECT_TYPE_PRIORITY_QUEUE,sizeof(__PRIORITY_QUEUE),
	PriQueueInitialize,PriQueueUninitialize)

	OBJECT_INIT_DATA(OBJECT_TYPE_KERNEL_THREAD,sizeof(__KERNEL_THREAD_OBJECT),
	KernelThreadInitialize,KernelThreadUninitialize)

	OBJECT_INIT_DATA(OBJECT_TYPE_EVENT,sizeof(__EVENT),
	EventInitialize,EventUninitialize)

	OBJECT_INIT_DATA(OBJECT_TYPE_MUTEX,sizeof(__MUTEX),
	MutexInitialize,MutexUninitialize)

	OBJECT_INIT_DATA(OBJECT_TYPE_TIMER,sizeof(__TIMER_OBJECT),
	TimerInitialize,TimerUninitialize)

	OBJECT_INIT_DATA(OBJECT_TYPE_INTERRUPT,sizeof(__INTERRUPT_OBJECT),
	InterruptInitialize,InterruptUninitialize)

	OBJECT_INIT_DATA(OBJECT_TYPE_DRIVER,sizeof(__DRIVER_OBJECT),
	DrvObjInitialize,DrvObjUninitialize)

	OBJECT_INIT_DATA(OBJECT_TYPE_DEVICE,sizeof(__DEVICE_OBJECT),
	DevObjInitialize,DevObjUninitialize)

	OBJECT_INIT_DATA(OBJECT_TYPE_DRCB,sizeof(__DRCB),
	DrcbInitialize,DrcbUninitialize)

	OBJECT_INIT_DATA(OBJECT_TYPE_MAILBOX,sizeof(__MAILBOX),
	MailBoxInitialize,MailBoxUninitialize)

	OBJECT_INIT_DATA(OBJECT_TYPE_PAGE_INDEX_MANAGER,sizeof(__PAGE_INDEX_MANAGER),
	PageInitialize,PageUninitialize)

	OBJECT_INIT_DATA(OBJECT_TYPE_VIRTUAL_MEMORY_MANAGER,sizeof(__VIRTUAL_MEMORY_MANAGER),
	VmmInitialize,VmmUninitialize)

	OBJECT_INIT_DATA(OBJECT_TYPE_COMMON_QUEUE,sizeof(__COMMON_QUEUE),
	CommQueueInit,CommQueueUninit)

	//OBJECT_INIT_DATA(OBJECT_TYPE_SEMAPHORE,sizeof(__SEMAPHORE),
	//SemaphoreInitialize,SemaphoreUninitialize)

END_DECLARE_INIT_DATA()

//
//The predefinition of ObjectManager's member functions.
//

static __COMMON_OBJECT* CreateObject(__OBJECT_MANAGER*,__COMMON_OBJECT*,DWORD);
static __COMMON_OBJECT* GetObjectByID(__OBJECT_MANAGER*,DWORD);
static __COMMON_OBJECT* GetFirstObjectByType(__OBJECT_MANAGER*,DWORD);
static VOID             DestroyObject(__OBJECT_MANAGER*,__COMMON_OBJECT*);

//
//The definition of the ObjectManager,the first object and the only object in Hello
//China.
//

__OBJECT_MANAGER    ObjectManager = {
	1,                                  //Current avaiable object ID.
	{0},
	CreateObject,                       //CreateObject routine.
	GetObjectByID,                      //GetObjectByID routine.
	GetFirstObjectByType,               //GetFirstObjectByType routine.
	DestroyObject,                      //DestroyObject routine.
};

//
// Create a object by Object Manager.
//
// Input:
//   @lpObjectManager    : The base address of Object Manager.
//   @lpObjectOwner      : The parent of the object will be created.
//   @dwType             : Which type of object will be created.
//
// Output:
//   If successfully,returns the base address of new created object,
//   otherwise,returns NULL.
//

static __COMMON_OBJECT* CreateObject(__OBJECT_MANAGER* lpObjectManager,    //Object Manager.
									 __COMMON_OBJECT*  lpObjectOwner,      //Object's owner.
									 DWORD             dwType)
{
	__COMMON_OBJECT* pObject         = NULL;
	DWORD            dwLoop          = 0L;
	BOOL             bFind           = FALSE;
	DWORD            dwObjectSize    = 0L;

	if((NULL == lpObjectManager) || (dwType >= MAX_OBJECT_TYPE))  //Parameters valid check.
		goto __TERMINAL;

	while(TRUE)    //To find the initialize data of this type object.
	{
		if(MAX_OBJECT_TYPE == dwLoop)
			break;
		if(0 == ObjectInitData[dwLoop].dwObjectType)
			break;
		if(dwType == ObjectInitData[dwLoop].dwObjectType)
		{
			bFind = TRUE;
			break;
		}
		dwLoop ++;
	}
	
	if(FALSE == bFind)    //If can not find the corrent initialize data.
		goto __TERMINAL;

	dwObjectSize = ObjectInitData[dwLoop].dwObjectSize;
	if(0 == dwObjectSize)  //Invalid object size.
		goto __TERMINAL;

	pObject = (__COMMON_OBJECT*)KMemAlloc(dwObjectSize,KMEM_SIZE_TYPE_ANY);
	if(NULL == pObject)  //Can not allocate memory.
		goto __TERMINAL;

	//The following lines initialize the new created object.
	pObject->dwObjectID = lpObjectManager->dwCurrentObjectID;
	lpObjectManager->dwCurrentObjectID ++;     //Now,update the Object Manager's status.

	pObject->dwObjectSize     = dwObjectSize;
	pObject->dwObjectType     = dwType;
	pObject->Initialize       = ObjectInitData[dwLoop].Initialize;
	pObject->Uninitialize     = ObjectInitData[dwLoop].Uninitialize;
	pObject->lpObjectOwner    = lpObjectOwner;

	//The following code insert the new created object into ObjectArrayList.
	if(NULL == lpObjectManager->ObjectListHeader[dwType].lpFirstObject)  //If this is the
		                                                                 //first object of
																		 //this type.
	{
		pObject->lpNextObject = NULL;
		pObject->lpPrevObject = NULL;
		lpObjectManager->ObjectListHeader[dwType].lpFirstObject = pObject;
		if(lpObjectManager->ObjectListHeader[dwType].dwMaxObjectID < pObject->dwObjectID)
		{
			lpObjectManager->ObjectListHeader[dwType].dwMaxObjectID = pObject->dwObjectID;
		}
		lpObjectManager->ObjectListHeader[dwType].dwObjectNum ++;
		goto __TERMINAL;
	}

	//If this object is not the first object of this type.
	pObject->lpNextObject = lpObjectManager->ObjectListHeader[dwType].lpFirstObject;
	pObject->lpNextObject->lpPrevObject = pObject;
	pObject->lpPrevObject = NULL;
	lpObjectManager->ObjectListHeader[dwType].lpFirstObject = pObject;
	if(lpObjectManager->ObjectListHeader[dwType].dwMaxObjectID < pObject->dwObjectID)
	{
		lpObjectManager->ObjectListHeader[dwType].dwMaxObjectID = pObject->dwObjectID;
	}
	lpObjectManager->ObjectListHeader[dwType].dwObjectNum ++;

__TERMINAL:
	return pObject;
}


//
// Get the base address of a object by it's ID.
// 
// Input:
//   @lpObjectManager    : The base address of Object Manager.
//   @dwObjectID         : The ID of the object whose base address will be got.
//
// Output:
//   The base address of the object,if failed,returns NULL.
//

static __COMMON_OBJECT* GetObjectByID(__OBJECT_MANAGER* lpObjectManager,
									  DWORD             dwObjectID)
{
	__COMMON_OBJECT*         lpObject     = NULL;
	DWORD                    dwLoop       = 0L;
	__OBJECT_LIST_HEADER*    lpListHeader = NULL;
	BOOL                     bFind        = FALSE;

	if(NULL == lpObjectManager)  //Parameters check.
		goto __TERMINAL;

	for(dwLoop = 0;dwLoop < MAX_OBJECT_TYPE;dwLoop ++)    //For every object type.
	{
		lpListHeader = &(lpObjectManager->ObjectListHeader[dwLoop]);
		if(lpListHeader->dwMaxObjectID < dwObjectID)  //If the maximal ID smaller than dwObjectID.
			continue;

		lpObject = lpListHeader->lpFirstObject;
		while(lpObject)    //For every object in this type list.
		{
			if(lpObject->dwObjectID == dwObjectID)  //Now,find the correct object.
			{
				bFind = TRUE;
				break;
			}
			lpObject = lpObject->lpNextObject;      //Seek the next object.
		}
		if(TRUE == bFind)  //Find the correct object.
			break;
	}

	if(FALSE == bFind)    //If can not find the correct object,set the return value to NULL.
		lpObject = NULL;

__TERMINAL:
	return lpObject;
}


//
// Get the first object by type.Using this function,you can list all of the objects
// belongs to one type.
// 
// Input:
//   @lpObjectManager    : The base address of Object Manager.
//   @dwObjectType       : Object type.
//
// Output:
//   Returns the base address of the first object,if failed,returns NULL.
//

static __COMMON_OBJECT* GetFirstObjectByType(__OBJECT_MANAGER* lpObjectManager,
											 DWORD             dwObjectType)
{
	__COMMON_OBJECT* lpObject = NULL;

	if((NULL == lpObjectManager) || (dwObjectType >= MAX_OBJECT_TYPE))    //Parameter check.
		goto __TERMINAL;

	lpObject = lpObjectManager->ObjectListHeader[dwObjectType].lpFirstObject;

__TERMINAL:
	return lpObject;
}


//
// Destroy one object.
//
// Input:
//   @lpObjectManager    : The base address of Object Manager.
//   @lpObject           : The base address of the object will be destroyed.
//
// Output:
//   No.
//

static VOID DestroyObject(__OBJECT_MANAGER* lpObjectManager,
						  __COMMON_OBJECT*  lpObject)
{
	__OBJECT_LIST_HEADER*      lpListHeader      = NULL;
	__COMMON_OBJECT*           lpTmpObject       = NULL;
	DWORD                      dwMaxID           = 0L;
	BOOL                       bFind             = FALSE;

	if((NULL == lpObjectManager) || (NULL == lpObject))  //Parameters check.
		goto __TERMINAL;

	if(lpObject->dwObjectType >= MAX_OBJECT_TYPE)  //If the type value exceed maximal value.
		goto __TERMINAL;

	lpListHeader = &(lpObjectManager->ObjectListHeader[lpObject->dwObjectType]);
	if(NULL == lpListHeader->lpFirstObject)
		goto __TERMINAL;
	dwMaxID = lpObject->dwObjectID;  //Record the object's ID.

	if(NULL == lpObject->lpPrevObject)  //This is the first object of the current list.
	{
		if(NULL == lpObject->lpNextObject) //This is the last object.
		{
			lpListHeader->lpFirstObject = NULL;
			lpListHeader->dwObjectNum --;
		}
		else    //This is not the last object.
		{
			lpObject->lpNextObject->lpPrevObject = NULL;
			lpListHeader->lpFirstObject = lpObject->lpNextObject;
			lpListHeader->dwObjectNum --;
		}
	}
	else  //This is not the first object of the current list.
	{
		if(NULL == lpObject->lpNextObject)  //This is the last object.
		{
			lpObject->lpPrevObject->lpNextObject = NULL;
			lpListHeader->dwObjectNum --;
		}
		else  //This is not the last object.
		{
			lpObject->lpPrevObject->lpNextObject = lpObject->lpNextObject;
			lpObject->lpNextObject->lpPrevObject = lpObject->lpPrevObject;
			lpListHeader->dwObjectNum --;
		}
	}

	lpObject->Uninitialize(lpObject);    //Call the Uninitialize routine to de-initialize
	                                     //the current object.

	KMemFree((LPVOID)lpObject,KMEM_SIZE_TYPE_ANY,lpObject->dwObjectSize);  //Free the
	                                                                       //Object's memory.

	if(dwMaxID >= lpListHeader->dwMaxObjectID)  //Now,should update the current list's maximal
		                                        //object ID.
	{
		lpTmpObject = lpListHeader->lpFirstObject;
		dwMaxID = lpTmpObject ? lpTmpObject->dwObjectID : 0;
		while(lpTmpObject)
		{
			if(dwMaxID < lpTmpObject->dwObjectID)
			{
				dwMaxID = lpTmpObject->dwObjectID;
			}
			lpTmpObject = lpTmpObject->lpNextObject;
		}
	}

	lpListHeader->dwMaxObjectID = dwMaxID;  //Update the current list's maximal ID value.

__TERMINAL:
	return;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
蜜臀av性久久久久蜜臀aⅴ流畅| 亚洲五月六月丁香激情| 亚洲色图19p| 日日欢夜夜爽一区| 丰满放荡岳乱妇91ww| 欧美最猛性xxxxx直播| xvideos.蜜桃一区二区| 亚洲一区二三区| 国产乱码一区二区三区| 在线成人免费观看| 国产色婷婷亚洲99精品小说| 日日噜噜夜夜狠狠视频欧美人| 成人做爰69片免费看网站| 欧美日韩你懂得| 亚洲精品综合在线| 国产 欧美在线| 精品美女一区二区三区| 五月天欧美精品| 99久久综合色| 国产嫩草影院久久久久| 国产一区二区三区蝌蚪| 欧美一区二区三区在线视频| 亚洲国产中文字幕在线视频综合| a4yy欧美一区二区三区| 久久久久久久久久久久久夜| 美女网站色91| 在线播放欧美女士性生活| 一区二区三区欧美亚洲| 91在线观看成人| 国产精品美女久久久久高潮| 国产精品自拍av| 久久精品无码一区二区三区| 精品中文字幕一区二区| 日韩精品中文字幕在线不卡尤物| 香蕉加勒比综合久久| 欧美三级韩国三级日本三斤| 一区二区三区成人在线视频| 色美美综合视频| 亚洲精品乱码久久久久久| 91啪在线观看| 亚洲精品乱码久久久久| 在线观看日韩电影| 国产精品网站在线观看| 成人性生交大片免费看中文| 国产精品美女久久久久久久久| 不卡电影一区二区三区| 亚洲人成在线观看一区二区| 色av成人天堂桃色av| 亚洲成人av福利| 欧美一区二区三区啪啪| 久久国产精品99精品国产| 日韩欧美国产一区二区三区| 国内精品视频666| 日本一区二区三区四区| 色呦呦网站一区| 午夜久久久久久电影| 国产精品午夜电影| 99久精品国产| 亚洲一区二区三区四区不卡| 欧美精品粉嫩高潮一区二区| 美女久久久精品| 国产婷婷色一区二区三区 | 亚洲美女电影在线| 色综合久久久久综合体桃花网| 亚洲国产精品影院| 欧美变态tickling挠脚心| 国产成人亚洲精品青草天美| 一区二区三区日韩| 日韩一区二区在线播放| 波多野洁衣一区| 五月天中文字幕一区二区| 久久―日本道色综合久久| 91蝌蚪国产九色| 日本91福利区| 中文字幕一区二区三区在线不卡 | 色综合色综合色综合| 天天综合色天天综合色h| 久久久久国产精品人| 色拍拍在线精品视频8848| 亚洲成人激情av| av色综合久久天堂av综合| 日韩欧美色综合| 91精品国产免费| 六月丁香婷婷色狠狠久久| 国产精品国产三级国产普通话99| 欧美在线高清视频| 激情文学综合插| 一二三区精品视频| 久久婷婷国产综合国色天香| 欧美无砖砖区免费| 国产成人免费视| 日韩av午夜在线观看| 亚洲视频一二三| 日韩欧美国产综合一区 | 亚洲观看高清完整版在线观看| 欧美成人a∨高清免费观看| 色婷婷精品久久二区二区蜜臂av| 精品一区二区在线免费观看| 亚洲午夜免费电影| 国产精品青草久久| 精品久久久久99| 7777精品伊人久久久大香线蕉经典版下载 | 中文一区二区完整视频在线观看| 欧美日韩一区不卡| 99久久国产综合色|国产精品| 精品午夜久久福利影院 | 97久久精品人人做人人爽50路| 蜜桃精品在线观看| 性感美女极品91精品| 亚洲久草在线视频| 国产精品女主播在线观看| 日韩免费高清视频| 欧美老女人在线| 欧美色图第一页| 色综合天天综合网天天看片| 成人永久aaa| 国产乱妇无码大片在线观看| 久久超碰97中文字幕| 蜜臀91精品一区二区三区| 日本va欧美va精品发布| 日韩中文字幕一区二区三区| 亚洲成av人**亚洲成av**| 成人综合日日夜夜| 日韩和欧美的一区| 亚洲一区二区欧美| 亚洲综合丝袜美腿| 亚洲一区二区黄色| 亚洲综合激情另类小说区| 一区二区三区鲁丝不卡| 一区二区在线观看不卡| 一区二区高清视频在线观看| 一二三四社区欧美黄| 亚洲va欧美va人人爽| 青草国产精品久久久久久| 蜜桃视频一区二区三区在线观看| 精品综合久久久久久8888| 国产精品1区二区.| 9色porny自拍视频一区二区| 一本到一区二区三区| 欧洲视频一区二区| 91精品国产欧美一区二区成人| 精品久久久三级丝袜| 国产欧美一区二区三区鸳鸯浴| 中文字幕中文在线不卡住| 夜夜精品视频一区二区| 青娱乐精品视频| 国产一区不卡视频| 91免费看`日韩一区二区| 宅男噜噜噜66一区二区66| 日韩精品一区二区三区在线播放 | 久久综合色综合88| 国产精品久久久久影院亚瑟| 亚洲自拍偷拍九九九| 美女性感视频久久| www.日韩大片| 91精品国产91热久久久做人人| 国产亚洲污的网站| 亚洲香肠在线观看| 国产在线一区观看| 91国模大尺度私拍在线视频| 欧美一级欧美一级在线播放| 中文字幕不卡三区| 日日骚欧美日韩| 波多野结衣视频一区| 日韩精品一区二区三区三区免费| 国产精品久久久久天堂| 日本不卡视频在线| www.欧美色图| 日韩一区二区在线免费观看| 一区精品在线播放| 久久99深爱久久99精品| 欧美精品一区二区三区蜜桃视频| 国产精品久久久久影院色老大| 日韩国产在线观看一区| 91小视频在线免费看| 精品国产一区久久| 亚洲午夜激情网站| 不卡的av在线| 久久综合成人精品亚洲另类欧美| 亚洲第一久久影院| 97se亚洲国产综合自在线观| 国产亚洲欧美日韩俺去了| 日韩av中文在线观看| 欧美中文字幕不卡| 国产精品入口麻豆原神| 久久99国产精品免费网站| 欧美日韩国产综合视频在线观看| 中文字幕亚洲视频| 国产福利一区二区| 精品对白一区国产伦| 日韩和欧美一区二区| 欧美高清视频不卡网| 一区二区免费看| 99视频精品在线| 中文字幕 久热精品 视频在线| 国产一区二区免费在线| 日韩美女天天操| 日本不卡在线视频| 欧美一区二区三区系列电影| 午夜欧美视频在线观看 |