亚洲欧美第一页_禁久久精品乱码_粉嫩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 "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电影在线观看一区| 精品国产麻豆免费人成网站| 蜜臀av性久久久久蜜臀aⅴ四虎| 91捆绑美女网站| 国产精品久久久久影院亚瑟| 国产黄色成人av| 国产日韩欧美综合一区| 国产麻豆成人传媒免费观看| 精品美女一区二区| 国模娜娜一区二区三区| 欧美成人官网二区| 国产黄色成人av| 精品美女一区二区| 理论电影国产精品| 久久久久国产精品人| 国产精品77777竹菊影视小说| 精品久久久久久久久久久久久久久久久| 日韩国产在线一| 欧美一区二区在线免费播放| 日本成人在线网站| 久久久久久毛片| av一区二区三区| 亚洲美女偷拍久久| 欧美日本在线播放| 蜜臀久久99精品久久久久久9| 日韩精品一区二区三区四区视频| 国产伦精品一区二区三区在线观看 | 极品瑜伽女神91| 亚洲精品一区二区精华| 国产成人av网站| 18欧美乱大交hd1984| 色av成人天堂桃色av| 天天影视涩香欲综合网| 精品国产成人系列| av一二三不卡影片| 亚洲超碰精品一区二区| 久久综合久久综合久久综合| 不卡一区二区在线| 亚洲午夜在线电影| 欧美精品一区二区三区很污很色的 | 亚洲午夜精品在线| 2020国产精品自拍| 在线免费av一区| 国产资源在线一区| 亚洲成在人线在线播放| 久久众筹精品私拍模特| 欧美亚洲一区二区在线| 韩日欧美一区二区三区| 一二三四区精品视频| 精品国产伦一区二区三区观看方式| www.视频一区| 免费三级欧美电影| 国产精品全国免费观看高清| 欧美美女一区二区在线观看| 国产激情精品久久久第一区二区| 香港成人在线视频| 国产精品久久久久久久裸模| 欧美www视频| 色八戒一区二区三区| 国产一区二区三区美女| 亚洲国产你懂的| 国产精品久久久久久妇女6080| 制服丝袜日韩国产| 色婷婷精品久久二区二区蜜臂av | 国产人伦精品一区二区| 7777精品伊人久久久大香线蕉完整版 | 亚洲一区二区美女| 国产精品久久久久久久浪潮网站 | 欧美视频三区在线播放| 99精品久久久久久| 韩国三级中文字幕hd久久精品| 午夜精品久久久久久久99樱桃| 国产精品理伦片| 久久伊人蜜桃av一区二区| 91精品在线一区二区| 色综合久久88色综合天天| 成人av片在线观看| 夫妻av一区二区| 韩国精品免费视频| 国内成人精品2018免费看| 午夜精品aaa| 亚洲成人av一区二区三区| 亚洲激情图片qvod| 亚洲天堂成人在线观看| 国产精品久久久久久福利一牛影视| 久久久久久一级片| 国产性色一区二区| 日本一区二区三区在线不卡| 久久综合国产精品| 久久久另类综合| 亚洲国产精品二十页| 久久亚洲一区二区三区明星换脸 | 精品国产污网站| 欧美亚洲国产一区二区三区| 色乱码一区二区三区88| 99热精品国产| 91丨九色丨黑人外教| 一本大道久久a久久综合婷婷| 国产精品一区一区三区| 麻豆91在线看| 国产成+人+日韩+欧美+亚洲| 豆国产96在线|亚洲| 国产99精品视频| 国产中文字幕一区| 精品一区二区成人精品| 国产成人免费高清| 日本大香伊一区二区三区| 色狠狠色噜噜噜综合网| 8x8x8国产精品| 欧美一区二区在线免费观看| 精品区一区二区| 国产欧美精品国产国产专区| xnxx国产精品| 欧美精品一区二区三区视频| 欧美三级三级三级爽爽爽| 精品国产免费久久| 亚洲小说春色综合另类电影| 狠狠色丁香婷婷综合| 91老师片黄在线观看| 精品国产欧美一区二区| 一区二区三区精密机械公司| 国产麻豆日韩欧美久久| 欧美日韩中文另类| 中文字幕中文字幕在线一区| 蜜桃在线一区二区三区| 91浏览器打开| 国产午夜精品一区二区三区嫩草| 亚洲一区在线视频| 国产精品888| 欧美成人bangbros| 偷窥国产亚洲免费视频| 99热精品一区二区| 国产色产综合色产在线视频| 日韩不卡一区二区三区 | 美国十次综合导航| 欧美伊人久久大香线蕉综合69 | 91看片淫黄大片一级在线观看| 日韩一二三区视频| 亚洲国产精品久久久男人的天堂| 国产91精品一区二区麻豆网站 | 欧美国产在线观看| 久久99精品久久久久久久久久久久| 色94色欧美sute亚洲线路二| 中文字幕国产一区| 国内精品伊人久久久久av一坑 | 国产女人18毛片水真多成人如厕| 日韩成人免费电影| 欧美日韩电影一区| 亚洲主播在线观看| 欧美亚洲综合色| 亚洲激情图片小说视频| 99re在线视频这里只有精品| 中文字幕+乱码+中文字幕一区| 国产一区二区三区在线观看免费 | 99re亚洲国产精品| 国产精品欧美一级免费| 高清不卡一区二区在线| 国产色爱av资源综合区| 国产91在线|亚洲| 国产清纯白嫩初高生在线观看91 | 国产精品色哟哟| 北岛玲一区二区三区四区| 亚洲国产精品黑人久久久| 久久疯狂做爰流白浆xx| 欧美精品三级日韩久久| 亚洲国产精品一区二区尤物区| 欧美在线免费观看视频| 亚洲成av人片观看| 欧美一区二区黄| 美女尤物国产一区| 久久女同精品一区二区| 国产91精品入口| 专区另类欧美日韩| 欧美性生活影院| 男人的天堂久久精品| 欧美精品一区二区三区蜜桃| 国产一区二区三区免费| 国产精品成人免费精品自在线观看| 成人sese在线| 亚洲第一久久影院| 欧美videofree性高清杂交| 国产精品77777| 亚洲欧美另类综合偷拍| 7777精品伊人久久久大香线蕉的| 久久激情五月激情| 国产欧美精品一区| 91麻豆精品视频| 蜜桃视频在线观看一区| 中文乱码免费一区二区| 欧美中文字幕久久| 国内精品伊人久久久久av一坑| 国产日韩欧美高清在线| 91麻豆精品一区二区三区| 蜜桃视频在线观看一区| 国产精品久久久久久久久免费樱桃 | 国产成人精品影院| 亚洲国产精品欧美一二99| 欧美va亚洲va在线观看蝴蝶网|