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

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

?? devmgr.cpp

?? 小型的操作系統開發的原代碼
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//***********************************************************************/
//    Author                    : Garry
//    Original Date             : Oct,15 2005
//    Module Name               : DEVMGR.CPP
//    Module Funciton           : 
//                                This module countains device manager object's implemen-
//                                tation code.
//    Last modified Author      :
//    Last modified Date        :
//    Last modified Content     :
//                                1.
//                                2.
//    Lines number              :
//***********************************************************************/


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

#ifndef __PCI_DRV_H__
#include "..\INCLUDE\PCI_DRV.H"
#endif

//
//Pre-declaration of local routines.
//
static BOOL DevMgrInitialize(__DEVICE_MANAGER*);
static BOOL CheckPortRegion(__DEVICE_MANAGER*,__RESOURCE*);
static BOOL ReservePortRegion(__DEVICE_MANAGER*,__RESOURCE*);
static VOID ReleasePortRegion(__DEVICE_MANAGER*,__RESOURCE*);
static VOID DeleteDevice(__DEVICE_MANAGER*,__PHYSICAL_DEVICE*);
static BOOL AppendDevice(__DEVICE_MANAGER*,__PHYSICAL_DEVICE*);
static __PHYSICAL_DEVICE* GetDevice(__DEVICE_MANAGER*,
									DWORD,
									__IDENTIFIER*,
									__PHYSICAL_DEVICE*);

//
//The implementation of DeviceManager's initialize routine.
//
static BOOL DevMgrInitialize(__DEVICE_MANAGER* lpDevMgr)
{
	BOOL                     bResult           = FALSE;
	__RESOURCE*              lpRes             = NULL;

	if(NULL == lpDevMgr)     //Invalid parameter.
		return FALSE;

	//lpRes = (__RESOURCE*)malloc(sizeof(__RESOURCE));
	lpRes = (__RESOURCE*)KMemAlloc(sizeof(__RESOURCE),KMEM_SIZE_TYPE_ANY);
	if(NULL == lpRes)    //Can not allocate memory.
		return FALSE;

	lpRes->dwResType = RESOURCE_TYPE_IO;
	lpRes->IOPort.wStartPort = MIN_IO_PORT;
	lpRes->IOPort.wEndPort   = MAX_IO_PORT;

	lpDevMgr->FreePortResource.dwResType = RESOURCE_TYPE_EMPTY;
	lpDevMgr->FreePortResource.lpNext    = lpRes;
	lpDevMgr->FreePortResource.lpPrev    = lpRes;
	lpRes->lpNext                        = &lpDevMgr->FreePortResource;
	lpRes->lpPrev                        = &lpDevMgr->FreePortResource;

	lpDevMgr->UsedPortResource.dwResType = RESOURCE_TYPE_EMPTY;
	lpDevMgr->UsedPortResource.lpNext    = &lpDevMgr->UsedPortResource;
	lpDevMgr->UsedPortResource.lpPrev    = &lpDevMgr->UsedPortResource;

	for(DWORD dwLoop = 0;dwLoop < MAX_BUS_NUM;dwLoop ++)  //Initialize bus array.
	{
		lpDevMgr->SystemBus[dwLoop].dwBusType    = BUS_TYPE_NULL;
		lpDevMgr->SystemBus[dwLoop].lpDevListHdr = NULL;
		lpDevMgr->SystemBus[dwLoop].lpHomeBridge = NULL;
		lpDevMgr->SystemBus[dwLoop].lpParentBus  = NULL;
	}

	//lpDevMgr->AppendDevice             = AppendDevice;
	//lpDevMgr->CheckPortRegion          = CheckPortRegion;
	//lpDevMgr->DeleteDevice             = DeleteDevice;
	//lpDevMgr->GetDevice                = GetDevice;
	//lpDevMgr->ReleasePortRegion        = ReleasePortRegion;
	//lpDevMgr->ReservePortRegion        = ReservePortRegion;

	//
	//Load system bus drivers here.
	//
	PciBusDriver(lpDevMgr);

	return TRUE;
}

//
//A helper routine,used to insert a IO port region into list,and keeps all port region
//in order.
//
static VOID InsertIntoList(__RESOURCE* lpListHdr,__RESOURCE* lpRes)
{
	__RESOURCE*            lpBefore              = NULL;

	if((NULL == lpListHdr) || (NULL == lpRes)) //Invalid parameters.
		return;
	lpBefore = lpListHdr->lpNext;
	while(lpBefore != lpListHdr)    //Travel the whole list to find a statisfying position.
	{
		if(lpBefore->IOPort.wStartPort >= lpRes->IOPort.wEndPort)  //Find it.
		{
			break;
		}
		lpBefore = lpBefore->lpNext;
	}
	//
	//Insert lpRes into the list.
	//
	lpRes->lpNext            = lpBefore;
	lpRes->lpPrev            = lpBefore->lpPrev;
	lpBefore->lpPrev->lpNext = lpRes;
	lpBefore->lpPrev         = lpRes;

	return;
}

//
//Some macros used to operate bi-direction link list.
//
#define INSERT_INTO_LIST(listhdr,node)        \
	InsertIntoList(listhdr,node)

#define DELETE_FROM_LIST(node)                \
	(node)->lpNext->lpPrev = (node)->lpPrev;  \
	(node)->lpPrev->lpNext = (node)->lpNext;

//
//The following routine is used to merge continues IO port region into one region.
//This is a helper routine,used by ReleasePortRegion to merge continues port region
//into one region.
//This routine searches the whole list,once find two continues region(wEndPort of the
//first region equals to wStartPort - 1 of the second region),then modify the first
//region's wEndPort to the second region's wEndPort,and delete the second region from
//list.
//
static VOID MergeRegion(__RESOURCE* lpListHdr)
{
	__RESOURCE*         lpFirst     = NULL;
	__RESOURCE*         lpSecond    = NULL;
	__RESOURCE*         lpTmp       = NULL;

	if(NULL == lpListHdr)
		return;
	lpFirst = lpListHdr->lpNext;
	while(lpFirst != lpListHdr)
	{
		lpSecond = lpFirst->lpNext;
		if(lpSecond == lpListHdr)    //Finished to search.
		{
			break;
		}
		if(lpFirst->IOPort.wEndPort + 1 == lpSecond->IOPort.wStartPort)  //Statisfy the continues
			                                                             //condition.
		{
			DELETE_FROM_LIST(lpSecond);    //Delete the second port region.
			lpFirst->IOPort.wEndPort = lpSecond->IOPort.wEndPort;  //Modify the first port region.
			KMemFree((LPVOID)lpSecond,KMEM_SIZE_TYPE_ANY,0L);
			//free((LPVOID)lpSecond);
			continue;
		}
		lpFirst = lpFirst->lpNext;
	}
}

//
//The implementation of ReservePortRegion routine.
//The second parameter,lpRes,indicates desired start address of port region,
//and port region's length can be calculated by minus start value from end value
//of the desired port region.
//
static BOOL ReservePortRegion(__DEVICE_MANAGER* lpDevMgr,__RESOURCE* lpRes)
{
	BOOL                      bResult                    = FALSE;
	WORD                      wSize                      = 0L;
	__RESOURCE*               lpStatisfy                 = NULL;
	__RESOURCE*               lpPotential                = NULL;
	BOOL                      bFind                      = FALSE;
	DWORD                     dwFlags                    = 0L;
	__RESOURCE*               lpFirstRegion              = NULL;
	__RESOURCE*               lpSecondRegion             = NULL;
	__RESOURCE*               lpRes1                     = NULL;

	if((NULL == lpDevMgr) || (NULL == lpRes))  //Invalid parameters.
		return bResult;
	if(lpRes->dwResType != RESOURCE_TYPE_IO)   //Invalid parameter.
		return bResult;
	if(lpRes->IOPort.wEndPort - lpRes->IOPort.wStartPort >= MAX_IO_PORT)
		return bResult;

	//lpRes1 = (__RESOURCE*)malloc(sizeof(__RESOURCE));
	lpRes1 = (__RESOURCE*)KMemAlloc(sizeof(__RESOURCE),KMEM_SIZE_TYPE_ANY);
	if(NULL == lpRes1)  //Can not allocate resource.
		return bResult;

	//
	//First,we look for free port list of DeviceManager object,to find
	//a block of port region statisify the original desired(lpRes).
	//
	wSize      = lpRes->IOPort.wEndPort - lpRes->IOPort.wStartPort + 1;
	__ENTER_CRITICAL_SECTION(NULL,dwFlags);
	lpStatisfy = lpDevMgr->FreePortResource.lpNext;

	while(lpStatisfy != &lpDevMgr->FreePortResource)    //Trave all the free port list.
	{
		if((lpStatisfy->IOPort.wStartPort <= lpRes->IOPort.wStartPort) &&
		   (lpStatisfy->IOPort.wEndPort   >= lpRes->IOPort.wEndPort))     //Find one.
		{
			bFind = TRUE;
			break;
		}
		if((lpStatisfy->IOPort.wEndPort - lpStatisfy->IOPort.wStartPort) >= wSize)
		{
			lpPotential = lpStatisfy;    //The current block can statisfy the size of original
			                             //request,so it is a potential statisfying region.
		}
		lpStatisfy = lpStatisfy->lpNext;
	}

	if(bFind)    //Found a IO port region statisfy the original request.
	{
		DELETE_FROM_LIST(lpStatisfy);    //Delete the region from free list.
		if(lpStatisfy->IOPort.wStartPort < lpRes->IOPort.wStartPort) //Exceed the request.
		{
			//lpFirstRegion = (__RESOURCE*)malloc(sizeof(__RESOURCE));
			lpFirstRegion = (__RESOURCE*)KMemAlloc(sizeof(__RESOURCE),KMEM_SIZE_TYPE_ANY);
			if(NULL != lpFirstRegion)  //Allocate successfully.
			{
				lpFirstRegion->dwResType = RESOURCE_TYPE_IO;
				lpFirstRegion->IOPort.wStartPort = lpStatisfy->IOPort.wStartPort;
				lpFirstRegion->IOPort.wEndPort   = lpRes->IOPort.wStartPort - 1;
				INSERT_INTO_LIST(&lpDevMgr->FreePortResource,lpFirstRegion);  //Insert into
			                                                                  //free list.
			}
		}
		if(lpStatisfy->IOPort.wEndPort > lpRes->IOPort.wEndPort) //Exceed the request.
		{
			//lpSecondRegion = (__RESOURCE*)malloc(sizeof(__RESOURCE));
			lpSecondRegion = (__RESOURCE*)KMemAlloc(sizeof(__RESOURCE),KMEM_SIZE_TYPE_ANY);
			if(NULL != lpSecondRegion)  //Allocate successfully.
			{
				lpSecondRegion->dwResType = RESOURCE_TYPE_IO;
				lpSecondRegion->IOPort.wStartPort = lpRes->IOPort.wEndPort + 1;
				lpSecondRegion->IOPort.wEndPort   = lpStatisfy->IOPort.wEndPort;
				INSERT_INTO_LIST(&lpDevMgr->FreePortResource,lpSecondRegion);
			}
		}
		lpRes1->dwResType = RESOURCE_TYPE_IO;
		lpRes1->IOPort.wStartPort = lpRes->IOPort.wStartPort;
		lpRes1->IOPort.wEndPort   = lpRes->IOPort.wEndPort;
		INSERT_INTO_LIST(&lpDevMgr->UsedPortResource,lpRes1);  //Insert it into used port list.
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		bResult = TRUE;
		KMemFree((LPVOID)lpStatisfy,KMEM_SIZE_TYPE_ANY,0L);
		//free((LPVOID)lpStatisfy);
		goto __TERMINAL;
	}

	if(lpPotential)    //Though can not find a IO port region statisfy the original request,
		               //but there is at least one region statisfy requesting size,so reserve
					   //this region.
	{
		DELETE_FROM_LIST(lpPotential);    //Delete from free list.
		if((WORD)(lpPotential->IOPort.wEndPort - lpPotential->IOPort.wStartPort) > wSize)
		{

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产盗摄女厕一区二区三区| 色天使久久综合网天天| 国产成人av一区二区三区在线| voyeur盗摄精品| 欧美一级高清片| 中文字幕中文字幕在线一区| 蜜臀av性久久久久av蜜臀妖精| 成人av电影观看| 精品少妇一区二区三区在线视频| 一区在线播放视频| 精品写真视频在线观看| 欧美日韩激情一区二区三区| 国产精品进线69影院| 精品亚洲国内自在自线福利| 欧美高清精品3d| 亚洲激情在线播放| youjizz国产精品| 国产欧美日韩精品a在线观看| 日av在线不卡| 欧美久久久久中文字幕| 亚洲综合av网| 色呦呦国产精品| 成人免费在线播放视频| 国产不卡视频一区| 久久久国产综合精品女国产盗摄| 免费成人在线网站| 91精品婷婷国产综合久久| 亚洲国产欧美在线| 欧美日韩精品电影| 图片区小说区国产精品视频| 欧美视频精品在线| 亚洲成人精品一区| 欧美日韩三级在线| 首页亚洲欧美制服丝腿| 制服丝袜亚洲色图| 免费欧美在线视频| 日韩欧美电影一二三| 男人操女人的视频在线观看欧美| 欧美一区二区三区四区视频| 婷婷丁香激情综合| 91麻豆精品国产91久久久久久久久 | 欧美猛男男办公室激情| 亚洲一区二区三区自拍| 欧美最猛性xxxxx直播| 夜夜夜精品看看| 欧美日本一道本在线视频| 五月天一区二区| 欧美xxxxx牲另类人与| 国产精品一线二线三线精华| 国产女同互慰高潮91漫画| 成人午夜免费av| 亚洲婷婷在线视频| 欧美在线观看禁18| 奇米精品一区二区三区在线观看 | 图片区日韩欧美亚洲| 日韩欧美激情四射| 国产成人av一区二区三区在线 | 久久综合狠狠综合久久激情 | 欧美丝袜丝交足nylons图片| 午夜精品久久久| 精品理论电影在线观看| 国产剧情一区二区三区| 中文字幕一区免费在线观看| 欧美专区亚洲专区| 狠狠色综合播放一区二区| 亚洲日本韩国一区| 91精品国产一区二区三区蜜臀| 国产一区二区不卡老阿姨| 亚洲三级电影网站| 欧美一区二区国产| 99久久777色| 久久福利视频一区二区| 中文字幕一区二区三区在线观看| 欧美日韩午夜影院| 国产.欧美.日韩| 午夜激情一区二区三区| 国产片一区二区| 337p亚洲精品色噜噜| 99久久99久久精品国产片果冻| 奇米综合一区二区三区精品视频| 中文字幕中文乱码欧美一区二区| 91精品国产91久久久久久最新毛片| 国产成人免费av在线| 日韩成人免费在线| 亚洲欧美自拍偷拍色图| 精品区一区二区| 欧美亚洲高清一区二区三区不卡| 国产精品自拍av| 秋霞成人午夜伦在线观看| 亚洲美女电影在线| 欧美激情综合在线| 日韩欧美黄色影院| 欧美撒尿777hd撒尿| 91丨porny丨国产| 国产盗摄一区二区| 极品少妇一区二区| 日韩一区精品视频| 一区二区三区加勒比av| 国产精品成人免费| 中文成人综合网| 精品av久久707| 欧美一区二区三区人| 在线不卡的av| 欧美亚洲高清一区| 欧美亚洲动漫精品| 在线日韩av片| 91精彩视频在线观看| 91丝袜美女网| 91啪亚洲精品| 色欲综合视频天天天| 91麻豆国产香蕉久久精品| 成人一区二区三区视频在线观看 | 精品国产一区二区三区不卡| 日韩午夜激情av| 91精品国产91热久久久做人人| 欧美日韩卡一卡二| 欧美另类videos死尸| 欧美精品在线观看一区二区| 欧美日韩精品福利| 欧美日韩国产一区二区三区地区| 欧美三级日韩三级国产三级| 欧美喷水一区二区| 91精品在线观看入口| 91精品国产综合久久福利软件| 欧美一区二区三区免费在线看 | 亚洲蜜桃精久久久久久久| 亚洲伦理在线精品| 亚洲国产精品人人做人人爽| 视频在线观看一区| 精品中文字幕一区二区小辣椒| 国产一区欧美日韩| 国产.欧美.日韩| 日本久久电影网| 88在线观看91蜜桃国自产| 欧美tk丨vk视频| 欧美极品xxx| 一区二区三区在线视频播放| 午夜视频在线观看一区二区| 日本中文字幕一区二区有限公司| 久久成人久久鬼色| 福利91精品一区二区三区| 一本久久精品一区二区| 欧美日韩aaaaaa| 国产色综合久久| 亚洲欧美日韩中文播放 | 国产精品美女久久久久久久久久久 | 国产高清精品网站| 99精品在线观看视频| 欧美日韩另类一区| 久久五月婷婷丁香社区| 亚洲美女一区二区三区| 蜜臀va亚洲va欧美va天堂| 不卡一区中文字幕| 欧美狂野另类xxxxoooo| 亚洲国产电影在线观看| 婷婷综合另类小说色区| 国产aⅴ精品一区二区三区色成熟| 91麻豆产精品久久久久久| 91精品国产免费| 国产精品日日摸夜夜摸av| 三级不卡在线观看| 成人黄色av电影| 制服丝袜中文字幕一区| 亚洲欧美另类小说| 九色|91porny| 在线观看区一区二| 国产日韩欧美激情| 天堂va蜜桃一区二区三区| 岛国一区二区三区| 日韩无一区二区| 亚洲福利视频一区二区| 成人黄色a**站在线观看| 日韩三级视频在线看| 亚洲午夜激情网页| av在线不卡电影| 久久综合狠狠综合久久综合88 | 国产a区久久久| 欧美一级欧美三级| 亚洲丶国产丶欧美一区二区三区| 成人看片黄a免费看在线| 日韩免费高清av| 亚洲国产视频网站| 91在线精品一区二区| 国产三级一区二区三区| 蜜桃在线一区二区三区| 欧美日韩成人一区二区| 一区二区三区中文在线观看| zzijzzij亚洲日本少妇熟睡| 国产欧美一二三区| 国产成人午夜视频| 国产欧美一区二区三区沐欲| 国产一区二区美女| 精品久久久久久亚洲综合网| 欧美aaaaa成人免费观看视频| 欧美精品1区2区| 日韩和欧美一区二区三区| 欧美视频中文一区二区三区在线观看| 亚洲欧美日韩在线不卡| 在线一区二区三区做爰视频网站| 最新热久久免费视频|