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

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

?? devmgr.cpp

?? 小型的操作系統(tǒng)開發(fā)的原代碼
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
			//lpFirstRegion = (__RESOURCE*)malloc(sizeof(__RESOURCE));
			lpFirstRegion = (__RESOURCE*)KMemAlloc(sizeof(__RESOURCE),KMEM_SIZE_TYPE_ANY);
			if(lpFirstRegion)  //Allocate memory successfully.
			{
				lpFirstRegion->dwResType = RESOURCE_TYPE_IO;
				lpFirstRegion->IOPort.wStartPort = lpPotential->IOPort.wStartPort + wSize;
				lpFirstRegion->IOPort.wEndPort   = lpPotential->IOPort.wEndPort;
				INSERT_INTO_LIST(&lpDevMgr->FreePortResource,lpFirstRegion);
			}
		}
		lpRes1->dwResType = RESOURCE_TYPE_IO;
		lpRes1->IOPort.wStartPort = lpPotential->IOPort.wStartPort;
		lpRes1->IOPort.wEndPort   = lpPotential->IOPort.wStartPort + wSize - 1;
		INSERT_INTO_LIST(&lpDevMgr->UsedPortResource,lpRes1);
		lpRes->IOPort.wStartPort  = lpRes1->IOPort.wStartPort;
		lpRes->IOPort.wEndPort    = lpRes1->IOPort.wEndPort;
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		bResult = TRUE;
		KMemFree((LPVOID)lpPotential,KMEM_SIZE_TYPE_ANY,0L);
		//free((LPVOID)lpPotential);
		goto __TERMINAL;
	}

	__LEAVE_CRITICAL_SECTION(NULL,dwFlags);

__TERMINAL:
	if(!bResult)  //Failed to reserve port.
	{
		KMemFree((LPVOID)lpRes1,KMEM_SIZE_TYPE_ANY,0L);  //Free memory used by lpRes1.
		//free((LPVOID)lpRes1);
		return bResult;
	}
	return bResult;
}

//
//The implementation of ReleasePortRegion routine.
//
static VOID ReleasePortRegion(__DEVICE_MANAGER* lpDevMgr,__RESOURCE* lpRes)
{
	BOOL                      bResult                    = FALSE;
	__RESOURCE*               lpUsed                     = NULL;
	DWORD                     dwFlags                    = 0L;

	if((NULL == lpDevMgr) || (NULL == lpRes)) //Invalid parameters.
		return;
	if(RESOURCE_TYPE_IO != lpRes->dwResType)  //Invalid resource descriptor.
		return;

	__ENTER_CRITICAL_SECTION(NULL,dwFlags);
	lpUsed = lpDevMgr->UsedPortResource.lpNext;

	while(lpUsed != &lpDevMgr->UsedPortResource)  //Travel whole list.
	{
		if((lpUsed->IOPort.wStartPort == lpRes->IOPort.wStartPort) &&
		   (lpUsed->IOPort.wEndPort   == lpRes->IOPort.wEndPort))  //Find the same region.
		{
			break;
		}
		lpUsed = lpUsed->lpNext;
	}
	if(lpUsed == &lpDevMgr->UsedPortResource)    //Can not find the original request one.
	{
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		return;
	}
	//
	//Now,we have found the IO port region that equals to lpRes,so delete it from the
	//used list,and insert it into free list.
	//
	DELETE_FROM_LIST(lpUsed);                               //Delete from used list.
	INSERT_INTO_LIST(&lpDevMgr->FreePortResource,lpUsed);   //Insert into free list.
	MergeRegion(&lpDevMgr->FreePortResource);        //Do a merge operation,to combine continues
	                                                 //port region into one region.
	__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
	return;
}

//
//The implement of CheckPortRegion.
//This routine is used to check if a block of port region is used,if used,then returns FALSE,
//else,returns TRUE.
//
static BOOL CheckPortRegion(__DEVICE_MANAGER* lpDevMgr,__RESOURCE* lpRes)
{
	__RESOURCE*             lpTmp             = NULL;
	DWORD                   dwFlags           = 0L;
	
	if((NULL == lpDevMgr) || (NULL == lpRes))  //Invalid parameters.
		return FALSE;
	if(RESOURCE_TYPE_IO != lpRes->dwResType)   //Also invalid parameter.
		return FALSE;

	__ENTER_CRITICAL_SECTION(NULL,dwFlags);
	lpTmp = lpDevMgr->FreePortResource.lpNext;

	while(lpTmp != &lpDevMgr->FreePortResource)  //Travel the whole free list.
	{
		if((lpTmp->IOPort.wStartPort <= lpRes->IOPort.wStartPort) && 
		   (lpTmp->IOPort.wEndPort   >= lpRes->IOPort.wEndPort))  //Not used.
		{
			__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
			return TRUE;
		}
		lpTmp = lpTmp->lpNext;
	}
	__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
	return FALSE;
}

//
//The following is a helper routine,used to check if two device identifiers are match.
//If the second Identifier(second parameter),"include" the first Identifier(first parameter),
//then it returns TRUE,otherwise,returns FALSE.
//
static BOOL DeviceIdMatch(__IDENTIFIER* lpFirst,__IDENTIFIER* lpSecond)
{
	UCHAR                 ucMask                = 0;

	if((NULL == lpFirst) || (NULL == lpSecond)) //Parameters check.
		return FALSE;
	if(lpFirst->dwBusType != lpSecond->dwBusType)  //Bus type does not match.
		return FALSE;
	if(lpFirst->dwBusType == BUS_TYPE_NULL)  //Invalid bus type.
		return FALSE;

	switch(lpFirst->dwBusType)
	{
	case BUS_TYPE_PCI:    //PCI Identifier match.
#define ID_MEMBER(id,mem) ((id)->PCI_Identifier.mem)
		if(ID_MEMBER(lpFirst,wVendor) == ID_MEMBER(lpSecond,wVendor))
			ucMask |= PCI_IDENTIFIER_MASK_VENDOR;
		if(ID_MEMBER(lpFirst,wDevice) == ID_MEMBER(lpSecond,wDevice))
			ucMask |= PCI_IDENTIFIER_MASK_DEVICE;
		if((lpFirst->PCI_Identifier.dwClass >> 8) == 
		   (lpSecond->PCI_Identifier.dwClass >> 8))
		    ucMask |= PCI_IDENTIFIER_MASK_CLASS;
		if(ID_MEMBER(lpFirst,ucHdrType) == ID_MEMBER(lpSecond,ucHdrType))
			ucMask |= PCI_IDENTIFIER_MASK_HDRTYPE;
		return ((lpFirst->PCI_Identifier.ucMask & ucMask) == lpFirst->PCI_Identifier.ucMask);

	case BUS_TYPE_ISA:    //ISA Identifier match.
		return (lpFirst->ISA_Identifier.dwDevice == lpSecond->ISA_Identifier.dwDevice);

	default:
		break;
	}
	return FALSE;
}

//
//The implementation of GetDevice routine.
//This routine returns the appropriate physical device object according to identifier.
//
static __PHYSICAL_DEVICE* GetDevice(__DEVICE_MANAGER*   lpDevMgr,
									DWORD               dwBusType,
									__IDENTIFIER*       lpId,
									__PHYSICAL_DEVICE*  lpStart)
{
	DWORD                           dwIndex             = 0L;
	DWORD                           dwFlags             = 0L;
	__PHYSICAL_DEVICE*              lpPhyDev            = NULL;

	if((NULL == lpDevMgr) || (NULL == lpId))  //Invalid parameters.
		return NULL;

	if(NULL == lpStart)    //Call this routine for the first time.
	{
		__ENTER_CRITICAL_SECTION(NULL,dwFlags);

		for(dwIndex = 0;dwIndex < MAX_BUS_NUM;dwIndex ++)
		{
			if(lpDevMgr->SystemBus[dwIndex].dwBusType != dwBusType)  //Bus type not match.
				continue;
			lpPhyDev = lpDevMgr->SystemBus[dwIndex].lpDevListHdr;
			while(lpPhyDev)
			{
#define DEVICE_ID_MATCH(id1,id2) (DeviceIdMatch((id1),(id2)))
				if(DEVICE_ID_MATCH(lpId,&lpPhyDev->DevId))  //ID match.
				{
					__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
					return lpPhyDev;    //Find a device object statisfying the request.
				}
				lpPhyDev = lpPhyDev->lpNext;
			}
		}
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		return lpPhyDev;    //If reach here,the requested device must have not been found.
	}
	else                    //This routine is called for the second time.
	{
		dwIndex = 
			(DWORD)((DWORD)(lpStart->lpHomeBus) - 
			(DWORD)(&lpDevMgr->SystemBus[0])) / sizeof(__SYSTEM_BUS);
		lpPhyDev = lpStart->lpNext;

		__ENTER_CRITICAL_SECTION(NULL,dwFlags);
		while((dwIndex < MAX_BUS_NUM) || lpPhyDev)
		{
			while(lpPhyDev)
			{
				if(DEVICE_ID_MATCH(lpId,&lpPhyDev->DevId))  //Find one.
				{
					__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
					return lpPhyDev;
				}
				lpPhyDev = lpPhyDev->lpNext;  //Try to match the next one.
			}
			dwIndex += 1;
			while(dwIndex < MAX_BUS_NUM)    //Try to search next BUS.
			{
				if(lpDevMgr->SystemBus[dwIndex].dwBusType != dwBusType)
				{
					dwIndex += 1;
					continue;
				}
				lpPhyDev = lpDevMgr->SystemBus[dwIndex].lpDevListHdr;
				break;    //Break form the loop.
			}
		}
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		return lpPhyDev;  //If reach here,the routine returns NULL.
	}
	return lpPhyDev;
}

//
//The implementation of AppendDevice routine.
//This routine append a physical device object into a BUS.
//
static BOOL AppendDevice(__DEVICE_MANAGER* lpDevMgr,__PHYSICAL_DEVICE* lpDev)
{
	return FALSE;
}

//
//The implementation of DeleteDevice routine.
//This routine deletes one physical device from system bus.
//
static VOID DeleteDevice(__DEVICE_MANAGER* lpDevMgr,__PHYSICAL_DEVICE* lpDev)
{
	return;
}

/****************************************************************************************
*****************************************************************************************
*****************************************************************************************
*****************************************************************************************
****************************************************************************************/

//
//The declaration of DeviceManager object.
//
__DEVICE_MANAGER DeviceManager = {
	{0},                               //SystemBus array.
	{0},                               //FreePortResource.
	{0},                               //UsedPortResource.
	DevMgrInitialize,                  //Initialize.
	GetDevice,                         //GetDevice.
	AppendDevice,                      //AppendDevice.
	DeleteDevice,                      //DeleteDevice.
	CheckPortRegion,                   //CheckPortRegion.
	ReservePortRegion,                 //ReservePortRegion.
	ReleasePortRegion                  //ReleasePortRegion.
};


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人免费一区二区三区视频| 另类小说色综合网站| 石原莉奈在线亚洲三区| 国产成人午夜精品影院观看视频 | 欧美成人一区二区三区在线观看| 国产精品久久久久婷婷| 久久精品免费看| 欧美日韩一区二区电影| 国产精品午夜在线| 韩国v欧美v日本v亚洲v| 欧美人与z0zoxxxx视频| 亚洲色大成网站www久久九九| 国产原创一区二区三区| 日韩一卡二卡三卡| 亚洲国产人成综合网站| 色天使色偷偷av一区二区| www国产精品av| 蜜臂av日日欢夜夜爽一区| 欧美综合在线视频| 亚洲桃色在线一区| 国产福利电影一区二区三区| 精品精品国产高清a毛片牛牛| 日韩av二区在线播放| 91福利在线导航| 亚洲欧美日韩国产手机在线 | 国模无码大尺度一区二区三区| 欧美三级韩国三级日本三斤| 夜夜嗨av一区二区三区四季av| k8久久久一区二区三区| 国产欧美日韩一区二区三区在线观看| 激情综合五月婷婷| 日韩亚洲欧美在线| 蜜桃视频一区二区三区| 欧美va亚洲va| 精品一区二区三区在线播放视频| 精品人在线二区三区| 久久99精品国产麻豆婷婷洗澡| 日韩欧美中文一区| 五月天亚洲精品| 91精品视频网| 久久99国产精品成人| 国产午夜三级一区二区三| 丁香六月综合激情| 国产精品不卡一区二区三区| 91视频一区二区| 亚洲精品久久久蜜桃| 欧美伊人精品成人久久综合97| 午夜精品福利视频网站| 欧美不卡在线视频| 成人午夜私人影院| 亚洲欧美日韩电影| 制服丝袜激情欧洲亚洲| 精品一区二区三区欧美| 中文在线资源观看网站视频免费不卡| 99久久久无码国产精品| 五月天中文字幕一区二区| 日韩欧美美女一区二区三区| 国产乱子伦一区二区三区国色天香| 国产女人aaa级久久久级| 91国偷自产一区二区使用方法| 免费在线观看一区| 国产精品久久久久久久久快鸭| 欧美性受极品xxxx喷水| 国内精品第一页| 亚洲激情六月丁香| 欧美成人r级一区二区三区| av动漫一区二区| 日韩国产精品久久久| 国产女主播在线一区二区| 欧美视频一区在线观看| 国产成人午夜电影网| 香蕉乱码成人久久天堂爱免费| 久久精品欧美一区二区三区麻豆 | 日韩欧美亚洲一区二区| 成人av网站免费| 全部av―极品视觉盛宴亚洲| 国产精品欧美一区二区三区| 91精品欧美久久久久久动漫 | 不卡影院免费观看| 日韩在线卡一卡二| 国产精品女人毛片| 欧美一卡二卡在线观看| 91色乱码一区二区三区| 国产真实乱偷精品视频免| 亚洲最大成人网4388xx| 国产欧美一二三区| 日韩欧美久久一区| 欧美亚洲一区二区在线| 国产99精品视频| 日韩1区2区3区| 一区二区不卡在线播放 | 亚洲精品一区二区三区福利 | 三级亚洲高清视频| 中文字幕一区二区三区不卡在线| 久久精品视频一区二区| 欧美日韩一区二区三区免费看| jiyouzz国产精品久久| 精品综合久久久久久8888| 日韩黄色免费网站| 一区二区三区四区乱视频| 国产午夜精品一区二区| 精品国产乱码久久| 91精品国产一区二区三区 | 亚洲自拍都市欧美小说| 国产精品国产精品国产专区不蜜 | 午夜久久福利影院| 一区二区三区四区高清精品免费观看 | 日韩成人av影视| 亚洲国产视频在线| 一区二区三区欧美亚洲| 亚洲欧洲日韩av| 亚洲视频网在线直播| 国产精品成人午夜| 亚洲视频在线一区二区| 亚洲欧美日韩国产另类专区| 亚洲欧美在线视频| 国产精品丝袜91| 亚洲人成7777| 亚洲一区二区三区视频在线| 亚洲国产aⅴ天堂久久| 午夜国产精品一区| 日产精品久久久久久久性色| 免费视频最近日韩| 久久99精品一区二区三区三区| 精彩视频一区二区三区| 国产精品一二三| 99re6这里只有精品视频在线观看| 成人国产电影网| 一本色道久久综合精品竹菊| 欧美色图片你懂的| 8v天堂国产在线一区二区| 日韩欧美在线1卡| 久久美女高清视频| 综合久久给合久久狠狠狠97色| 亚洲精品日产精品乱码不卡| 五月激情综合网| 久久精品免费观看| 成人a区在线观看| 欧美三级乱人伦电影| 欧美xxxxxxxx| 亚洲女同一区二区| 午夜电影网一区| 国产精品自拍三区| 色综合久久久久久久久久久| 337p亚洲精品色噜噜| 国产女同性恋一区二区| 亚洲福利电影网| 国产一区二区影院| 91福利视频久久久久| 欧美一级二级三级乱码| 国产精品久久久久久久久动漫| 亚洲国产色一区| 国产精品一区二区三区乱码| 欧美又粗又大又爽| 久久综合九色欧美综合狠狠| 亚洲视频在线一区观看| 久久99深爱久久99精品| 91在线小视频| 精品少妇一区二区三区在线播放 | 欧美日韩情趣电影| 国产欧美视频在线观看| 日本美女视频一区二区| av一区二区三区黑人| 这里只有精品免费| 中文字幕中文字幕一区二区| 秋霞午夜鲁丝一区二区老狼| 91蝌蚪国产九色| 久久久无码精品亚洲日韩按摩| 午夜日韩在线观看| www.在线欧美| 久久久久久久久久美女| 日韩高清在线观看| 在线观看国产日韩| 国产日韩v精品一区二区| 美日韩黄色大片| 777久久久精品| 亚洲午夜久久久久中文字幕久| 成人黄色软件下载| 久久尤物电影视频在线观看| 男女性色大片免费观看一区二区| 欧美三级乱人伦电影| 亚洲色欲色欲www在线观看| 国产伦精品一区二区三区免费迷| 日韩一区二区在线看片| 亚洲免费观看高清完整版在线 | 亚洲一区二区在线免费看| 成人精品鲁一区一区二区| 精品福利二区三区| 麻豆中文一区二区| 4hu四虎永久在线影院成人| 亚洲高清在线精品| 欧美午夜一区二区三区| 一区二区高清免费观看影视大全| 色综合久久久久综合体| 亚洲私人影院在线观看| 99精品国产91久久久久久| 亚洲欧洲一区二区在线播放| 99久久国产免费看| 国产精品国产馆在线真实露脸 | 成人免费视频caoporn|