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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? devmgr.cpp

?? 小型的操作系統(tǒng)開發(fā)的原代碼
?? CPP
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
//***********************************************************************/
//    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)
		{

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美色国产精品| 欧美性感一区二区三区| 亚洲精品v日韩精品| 欧美一区二区视频免费观看| 国产91精品一区二区麻豆亚洲| 亚洲国产综合视频在线观看| 中文子幕无线码一区tr| 欧美卡1卡2卡| 97se亚洲国产综合自在线观| 国内精品嫩模私拍在线| 亚洲国产精品久久不卡毛片 | 91精品国产综合久久精品图片| 国产精品1024| 蜜桃91丨九色丨蝌蚪91桃色| 亚洲尤物视频在线| 中文字幕在线免费不卡| 久久久亚洲午夜电影| 欧美电影影音先锋| 欧美午夜精品一区二区蜜桃| 91在线观看地址| 国产69精品久久777的优势| 另类小说色综合网站| 亚洲chinese男男1069| 日韩理论片一区二区| 国产三级三级三级精品8ⅰ区| 日韩欧美国产电影| 欧美一激情一区二区三区| 欧美日韩三级一区二区| 欧美视频在线一区二区三区| 一本久久综合亚洲鲁鲁五月天 | 欧美中文字幕一二三区视频| 波多野结衣欧美| 国产成人精品一区二| 国产一区二区成人久久免费影院| 热久久国产精品| 免费美女久久99| 日本大胆欧美人术艺术动态| 污片在线观看一区二区| 日韩在线a电影| 秋霞午夜鲁丝一区二区老狼| 日本不卡一区二区| 日韩高清在线不卡| 久久99精品久久久久婷婷| 精品午夜久久福利影院 | 91成人在线免费观看| 91麻豆免费视频| 欧美亚洲综合久久| 精品视频一区 二区 三区| 欧美巨大另类极品videosbest| 欧美日韩日日摸| 91精品午夜视频| 精品国产乱码久久久久久影片| 精品国精品自拍自在线| 国产日产欧美一区二区三区 | 一区二区三区精品在线观看| 亚洲在线一区二区三区| 午夜国产精品一区| 免费成人美女在线观看| 国产一区二区视频在线| 成人免费观看av| 色网站国产精品| 欧美丰满一区二区免费视频 | 国产精品伦理在线| 一区二区三区加勒比av| 日本不卡1234视频| 国产一区二区导航在线播放| 99re这里都是精品| 欧美精品高清视频| 久久综合久久久久88| 亚洲欧美影音先锋| 天天做天天摸天天爽国产一区| 精品一区二区国语对白| 91网站在线播放| 91精品麻豆日日躁夜夜躁| 精品国产乱码久久久久久牛牛| 国产亚洲欧洲997久久综合| 亚洲三级在线免费观看| 午夜视频一区二区三区| 国产激情视频一区二区三区欧美 | 免费一级欧美片在线观看| 狠狠狠色丁香婷婷综合久久五月| 成人av资源站| 在线播放日韩导航| 国产精品三级久久久久三级| 三级在线观看一区二区| 国产福利视频一区二区三区| 欧美亚洲高清一区二区三区不卡| 精品粉嫩超白一线天av| 一区二区三区四区不卡在线| 麻豆91在线播放免费| 色网综合在线观看| 久久久久免费观看| 亚洲444eee在线观看| 成人午夜在线视频| 欧美一区二区三区人| 一区二区三区四区高清精品免费观看 | 日本欧美一区二区| 色综合久久久久久久久| 26uuuu精品一区二区| 亚洲成人自拍偷拍| av中文字幕亚洲| 久久蜜桃香蕉精品一区二区三区| 亚洲国产三级在线| 9l国产精品久久久久麻豆| 日韩免费电影网站| 亚洲午夜久久久久中文字幕久| 丁香亚洲综合激情啪啪综合| 日韩精品影音先锋| 亚洲国产精品久久人人爱| 精品999在线播放| 日韩欧美一级在线播放| 亚洲免费观看在线视频| 国产精品一二三区在线| 欧美顶级少妇做爰| 一二三四区精品视频| 成人午夜电影网站| 久久精品一区四区| 久久成人羞羞网站| 91麻豆精品91久久久久同性| 亚洲国产综合在线| 色欧美日韩亚洲| 亚洲欧美一区二区视频| 成人国产亚洲欧美成人综合网 | 精品福利av导航| 麻豆精品一二三| 正在播放一区二区| 日韩精品乱码免费| 欧美一区二区三区在线看| 日韩综合一区二区| 欧美二区乱c少妇| 天堂成人国产精品一区| 欧美挠脚心视频网站| 亚洲大尺度视频在线观看| 91国偷自产一区二区三区成为亚洲经典 | 中文字幕不卡一区| 国产一区二区福利视频| 欧美精品一区二区三区蜜桃| 久久国产尿小便嘘嘘尿| 日韩久久免费av| 国内外成人在线| 久久久久久久网| 成人自拍视频在线| 国产精品久久久一区麻豆最新章节| 风间由美一区二区av101| 中文成人综合网| 91无套直看片红桃| 亚洲一级二级三级| 欧美肥妇free| 久久99在线观看| 国产无一区二区| 99久久夜色精品国产网站| 亚洲毛片av在线| 91精品国产免费| 国产精品一区三区| 国产精品久久久久久户外露出| 色屁屁一区二区| 美女性感视频久久| 久久久三级国产网站| av激情综合网| 天天操天天综合网| 欧美videossexotv100| 国产成人免费视频网站高清观看视频 | 91丝袜呻吟高潮美腿白嫩在线观看| 亚洲免费资源在线播放| 欧美日本一道本在线视频| 奇米888四色在线精品| 国产午夜精品福利| 91国产免费看| 久久91精品国产91久久小草 | 老司机午夜精品| 国产女同性恋一区二区| 色哟哟国产精品| 日本少妇一区二区| 国产精品素人视频| 欧美日韩国产一区| 国产乱理伦片在线观看夜一区 | 国产精品白丝jk黑袜喷水| 国产精品久久久久久久浪潮网站| 欧美在线一区二区三区| 精品一区二区免费在线观看| 亚洲欧美另类小说视频| 日韩欧美国产电影| 色婷婷久久综合| 国产米奇在线777精品观看| 亚洲六月丁香色婷婷综合久久 | 国产精品欧美一区二区三区| 欧美日韩三级一区| 懂色av一区二区三区免费看| 一区二区三区鲁丝不卡| 国产欧美一区二区精品久导航 | 麻豆精品视频在线观看视频| 中文字幕国产一区| 欧美一区二区二区| 91偷拍与自偷拍精品| 国产一区欧美日韩| 日韩—二三区免费观看av| 国产精品久久久久三级| 精品美女被调教视频大全网站| 欧美亚洲动漫另类| 成人va在线观看|