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

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

?? netbuff.cpp

?? 小型的操作系統開發的原代碼
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//

static __NET_BUFFER* NetBufferGet(__NET_BUFFER* lpNetBuffer)
{
	if(NULL == lpNetBuffer)    //Parameter check.
		return NULL;
	AtomicInc(&lpNetBuffer->Users);    //Increment the reference counter.
	return lpNetBuffer;
}

//
//The implementation of NetBufferPull.
//

static UCHAR* NetBufferPull(__NET_BUFFER* lpNetBuffer,INT nOffset)
{
	DWORD                   dwFlags                   = 0L;

	if(NULL == lpNetBuffer)    //Parameter check.
		return NULL;
	if(NET_BUFFER_SHARED(lpNetBuffer)) //The net buffer is shared by other entities.
		return NULL;
	__ENTER_CRITICAL_SECTION(NULL,dwFlags);
	lpNetBuffer->lpDataHdr += nOffset;
	if(lpNetBuffer->lpDataHdr < lpNetBuffer->lpBufferHdr)  //The nOffset is negative,and
		                                                   //it exceed the headroom.
	{
		lpNetBuffer->lpDataHdr -= nOffset;
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		return NULL;
	}
	if(lpNetBuffer->lpDataHdr >= lpNetBuffer->lpDataEnd)  //Exceed valid range.
	{
		lpNetBuffer->lpDataHdr -= nOffset;
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		return NULL;
	}
	lpNetBuffer->dwDataLen  += nOffset;    //Update the data length.
	lpNetBuffer->dwTotalLen += nOffset;    //Update the tatol length.
	__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
	return lpNetBuffer->lpDataHdr;             //Returns the start address of data area.
}

//
//The implementation of NetBufferPush.
//

static UCHAR* NetBufferPush(__NET_BUFFER* lpNetBuffer,INT nOffset)
{
	DWORD                   dwFlags                   = 0L;

	if(NULL == lpNetBuffer)    //Parameter check.
		return NULL;
	if(NET_BUFFER_SHARED(lpNetBuffer)) //The net buffer is shared by other entities.
		return NULL;
	__ENTER_CRITICAL_SECTION(NULL,dwFlags);
	lpNetBuffer->lpDataHdr -= nOffset;
	if(lpNetBuffer->lpDataHdr < lpNetBuffer->lpBufferHdr)  //The nOffset is larger than
		                                                   //data buffer's headroom.
	{
		lpNetBuffer->lpDataHdr += nOffset;
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		return NULL;
	}
	if(lpNetBuffer->lpDataHdr >= lpNetBuffer->lpDataEnd)  //The nOffset is negative,and
		                                                  //it's absolute value is larger than
														  //data area.
	{
		lpNetBuffer->lpDataHdr += nOffset;
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		return NULL;
	}
	lpNetBuffer->dwDataLen  -= nOffset;
	lpNetBuffer->dwTotalLen -= nOffset;
	__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
	return lpNetBuffer->lpDataHdr;             //Returns the start address of data area.
}

//
//The implementation of NetBufferPut.
//

static UCHAR* NetBufferPut(__NET_BUFFER* lpNetBuffer,INT nOffset)
{
	DWORD                  dwFlags                   = 0L;
	UCHAR*                 lpTmp                     = NULL;

	if(NULL == lpNetBuffer)    //Parameter check.
		return NULL;
	if(NET_BUFFER_SHARED(lpNetBuffer)) //The net buffer object is shared by other entity.
		return NULL;

	__ENTER_CRITICAL_SECTION(NULL,dwFlags);
	lpTmp = lpNetBuffer->lpDataEnd;
	lpNetBuffer->lpDataEnd += nOffset;    //Add the offset.
	if(lpNetBuffer->lpDataEnd <= lpNetBuffer->lpDataHdr)  //Exceed the data area.
	{
		lpNetBuffer->lpDataEnd -= nOffset; //Restore the initial value.
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		return NULL;
	}
	if(lpNetBuffer->lpDataEnd > lpNetBuffer->lpBufferEnd) //The nOffset larger than tailroom.
	{
		lpNetBuffer->lpDataEnd -= nOffset;
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		return NULL;
	}
	lpNetBuffer->dwDataLen  += nOffset;
	lpNetBuffer->dwTotalLen += nOffset;
	__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
	return lpTmp;
}

//
//The implementation of NetBufferReserve.
//

static BOOL NetBufferReserve(__NET_BUFFER* lpNetBuffer,INT nLen)
{
	DWORD                    dwFlags                   = 0L;

	if(NULL == lpNetBuffer)  //Parameter check.
		return FALSE;
	if(NET_BUFFER_SHARED(lpNetBuffer))  //The net buffer object is shared by other entity.
		return FALSE;
	__ENTER_CRITICAL_SECTION(NULL,dwFlags);
	lpNetBuffer->lpDataHdr  += nLen;
	lpNetBuffer->lpDataEnd  += nLen;
	if((lpNetBuffer->lpDataHdr <  lpNetBuffer->lpBufferHdr) ||
	   (lpNetBuffer->lpDataEnd >= lpNetBuffer->lpBufferEnd))    //Exceed valid range.
	{
		lpNetBuffer->lpDataEnd -= nLen;
		lpNetBuffer->lpDataHdr -= nLen;
		//__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		return NULL;
	}
	__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
	return TRUE;
}

//
//The implementation of NetBufferStore.
//In current implementation,this routine can be replaced by NetBufferPut routine,because
//the NetBufferStore routine does not process the fragment data.
//

static BOOL NetBufferStore(__NET_BUFFER* lpNetBuffer,INT nOffset,UCHAR* lpSrc,DWORD dwLen)
{
	return FALSE;
}

//
//The implementation of NetBufferSave.
//

static BOOL NetBufferSave(__NET_BUFFER* lpNetBuffer,INT nOffset,UCHAR* lpDes,DWORD dwLen)
{
	return FALSE;
}

//
//The implementation of NetBufferExpand.
//This routine create a new data buffer,copy the old data buffer's data into the new one,
//and append all fragment data of old data buffer to new one,then release the old data
//buffer.
//If the net buffer or data buffer is shared,then only returns FALSE.
//

static BOOL NetBufferExpand(__NET_BUFFER* lpNetBuffer,DWORD dwHeadroom,DWORD dwTailroom)
{
	__FRAG_DATA*           lpFragData                 = NULL;
	__NET_BUFFER*          lpNetBuff                  = NULL;
	DWORD                  dwFlags                    = 0L;
	DWORD                  dwBuffSize                 = 0L;
	UCHAR*                 lpTmpBuff                  = NULL;
	UCHAR*                 lpDataStart                = NULL;

	if(NULL == lpNetBuffer) //Parameter check.
		return FALSE;
	if(NET_BUFFER_SHARED(lpNetBuffer)) //The net buffer is shared.
		return FALSE;
	lpFragData = NET_BUFFER_FRAG_DATA(lpNetBuffer);  //Get fragment data.
	if(AtomicGet(&lpFragData->SharedCounter) != 1)   //The data buffer is shared also.
		return FALSE;
	dwBuffSize = NET_BUFFER_DATA_LEN(lpNetBuffer) + dwHeadroom + dwTailroom;
	lpTmpBuff  = ALLOC_DATA_MEMORY(dwBuffSize);
	if(NULL == lpTmpBuff)    //Can not allocate data memory.
		return FALSE;
	lpDataStart = lpTmpBuff + dwHeadroom;
	MemCpy(lpDataStart,lpNetBuffer->lpDataHdr,NET_BUFFER_DATA_LEN(lpNetBuffer));  //Copy data.
	lpDataStart += NET_BUFFER_DATA_LEN(lpNetBuffer);
	lpDataStart += dwTailroom;
	MemCpy(lpDataStart,lpNetBuffer->lpBufferEnd,FRAG_DATA_SIZE);  //Copy fragment data.
	__ENTER_CRITICAL_SECTION(NULL,dwFlags);
	FREE_DATA_MEMORY(lpNetBuffer->lpBufferHdr);    //Release the old data buffer.
	lpNetBuffer->lpBufferHdr  = lpTmpBuff;
	lpNetBuffer->lpBufferEnd  = lpDataStart;
	lpNetBuffer->lpDataHdr    = lpTmpBuff + dwHeadroom;
	lpNetBuffer->lpDataEnd    = lpDataStart - dwTailroom;
	__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
	return TRUE;
}

//
//The implementation of NetBufferAppendFrag.
//This routine add a fragment data to the net buffer's frag data list.
//If the current data buffer or the net buffer object is shared,this 
//routine will do nothing,only returns FALSE.
//Parameters:
// @lpNetBuffer : The net buffer object which fragment data will be appended to.
// @lpAppended  : The net buffer object which will be appended.
//That is,this routine will put lpAppended to lpNetBuffer's fragment data.
//

static BOOL NetBufferAppendFrag(__NET_BUFFER* lpNetBuffer,__NET_BUFFER* lpAppended)
{
	__FRAG_DATA*                lpFragData                = NULL;
	DWORD                       dwFlags                   = 0L;

	if((NULL == lpNetBuffer) || (NULL == lpAppended)) //Parameter check.
		return FALSE;
	__ENTER_CRITICAL_SECTION(NULL,dwFlags);
	if(NET_BUFFER_SHARED(lpNetBuffer))    //The target net buffer is shared.
	{
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		return FALSE;
	}
	lpFragData = NET_BUFFER_FRAG_DATA(lpNetBuffer);   //Get the fragment control block.
	if(AtomicGet(&lpFragData->SharedCounter) != 1)    //The data buffer is shared.
	{
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		return FALSE;
	}
	//
	//The following code append the lpAppended to the fragment list.
	//
	NetBufferGet(lpAppended);    //Increment the reference counter.
	lpFragData->FragQueue.InsertIntoQueue(&lpFragData->FragQueue,lpAppended);  //Insert into queue.
	lpNetBuffer->dwTotalLen += NET_BUFFER_DATA_LEN(lpAppended);  //Update total length.
	__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
	return TRUE;
}

//
//The implementation of NetBufferGetFrag.
//This routine gets the first fragment data from fragment list.
//If the net buffer object is shared,or the data buffer is shared,
//this routine will do nothing,only returns a NULL.
//

static __NET_BUFFER* NetBufferGetFrag(__NET_BUFFER* lpNetBuffer)
{
	return NULL;
}

//
//The implementation of NetBufferCopy.
//

static __NET_BUFFER* NetBufferCopy(__NET_BUFFER* lpNetBuffer)
{
	return NULL;
}

//
//The implementation of NetBufferSharedCopy.
//

static __NET_BUFFER* NetBufferSharedCopy(__NET_BUFFER* lpNetBuffer)
{
	return NULL;
}

//
//The implementation of NetBufferPackCopy.
//This routine allocates a new net buffer object and a new data buffer,
//then copies the data buffer,including fragment data,into the new data buffer,
//and returns the new created net buffer object.
//

static __NET_BUFFER* NetBufferPackCopy(__NET_BUFFER_MANAGER* lpManager,__NET_BUFFER* lpNetBuffer)
{
	__NET_BUFFER*                     lpNetBuff      = NULL;
	__NET_BUFFER*                     lpFragBuff     = NULL;
	__FRAG_DATA*                      lpFragData     = NULL;
	DWORD                             dwFlags        = 0L;
	DWORD                             dwBuffSize     = 0L;
	UCHAR*                            lpDataBuff     = NULL;

	if(NULL == lpNetBuffer)    //Parameter check.
		return NULL;
	__ENTER_CRITICAL_SECTION(NULL,dwFlags);
	dwBuffSize  = NET_BUFFER_TOTAL_LEN(lpNetBuffer);  //Get the total length.
	dwBuffSize += NET_BUFFER_HEADROOM(lpNetBuffer);
	dwBuffSize += NET_BUFFER_TAILROOM(lpNetBuffer);
	lpNetBuff  = NetBufferAlloc(lpManager,dwBuffSize);  //Allocate a new net buffer object.
	if(NULL == lpNetBuff)     //Can not allocate net buffer object,may caused by less memory.
	{
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		return NULL;
	}
	NetBufferReserve(lpNetBuff,NET_BUFFER_HEADROOM(lpNetBuffer));  //Reserve head room.
	MemCpy((LPVOID)NetBufferPut(lpNetBuff,NET_BUFFER_DATA_LEN(lpNetBuffer)),
		lpNetBuffer->lpDataHdr,NET_BUFFER_DATA_LEN(lpNetBuffer));  //Copy data.
	lpFragData = NET_BUFFER_FRAG_DATA(lpNetBuffer);
	DWORD dwQueueLen = lpFragData->FragQueue.GetQueueLen(&lpFragData->FragQueue);
	for(DWORD dwLoop = 0;dwLoop < dwQueueLen;dwLoop ++)  //Copy fragment data.
	{
		lpFragBuff = lpFragData->FragQueue.GetFromQueue(&lpFragData->FragQueue);
		MemCpy((LPVOID)NetBufferPut(lpNetBuff,NET_BUFFER_DATA_LEN(lpFragBuff)),
			lpFragBuff->lpDataHdr,NET_BUFFER_DATA_LEN(lpFragBuff));
		lpFragData->FragQueue.InsertIntoQueue(&lpFragData->FragQueue,
			lpFragBuff);    //Re-insert into the frag queue again.
	}
	__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
	return lpNetBuff;
}

//
//The implementation of NetBufferClone.
//

static __NET_BUFFER* NetBufferClone(__NET_BUFFER* lpNetBuffer)
{
	return NULL;
}

//
//The implementation of Initialize.
//

static BOOL ManagerInitialize(__NET_BUFFER_MANAGER* lpManager)
{
	if(NULL == lpManager)    //Parameter check.
		return FALSE;

	lpManager->FreeBufferLink.lpNext       = NULL;
	lpManager->FreeBufferLink.dwLinkLen    = 0L;
	lpManager->Initialize                  = ManagerInitialize;
	lpManager->NetBufferAlloc              = NetBufferAlloc;
	lpManager->NetBufferFreeData           = NetBufferFreeData;
	lpManager->NetBufferFree               = NetBufferFree;
	lpManager->NetBufferGet                = NetBufferGet;
	lpManager->NetBufferPull               = NetBufferPull;
	lpManager->NetBufferPush               = NetBufferPush;
	lpManager->NetBufferPut                = NetBufferPut;
	lpManager->NetBufferReserve            = NetBufferReserve;
	lpManager->NetBufferStore              = NetBufferStore;
	lpManager->NetBufferSave               = NetBufferSave;
	lpManager->NetBufferExpand             = NetBufferExpand;
	lpManager->NetBufferAppendFrag         = NetBufferAppendFrag;
	lpManager->NetBufferGetFrag            = NetBufferGetFrag;
	lpManager->NetBufferCopy               = NetBufferCopy;
	lpManager->NetBufferSharedCopy         = NetBufferSharedCopy;
	lpManager->NetBufferPackCopy           = NetBufferPackCopy;
	lpManager->NetBufferClone              = NetBufferClone;

	return TRUE;
}

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

//
//Global object : NetBufferManager.
//This object is used by all network entitis to operate net buffers.
//

__NET_BUFFER_MANAGER NetBufferManager;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品国产综合久久久久久| 日韩一区二区在线观看视频播放| 久久综合一区二区| 亚洲二区在线观看| 波多野结衣91| 久久伊99综合婷婷久久伊| 婷婷国产在线综合| 一本大道久久a久久综合| 久久精品无码一区二区三区| 免费看欧美女人艹b| 欧美性猛片aaaaaaa做受| 国产精品素人一区二区| 国产在线不卡一区| 69堂亚洲精品首页| 亚洲国产精品一区二区久久恐怖片 | 欧美中文字幕亚洲一区二区va在线| 久久五月婷婷丁香社区| 日本欧美大码aⅴ在线播放| 91成人在线精品| 自拍偷拍欧美激情| 成人黄色a**站在线观看| 久久久99精品免费观看不卡| 蜜臀av性久久久久蜜臀aⅴ四虎| 91久久国产最好的精华液| 亚洲欧美在线观看| a在线播放不卡| 中文字幕中文字幕一区| 成人中文字幕电影| 国产精品丝袜久久久久久app| 国产一区二区三区av电影| 欧美成人性战久久| 久久精品国产精品亚洲精品| 欧美一级专区免费大片| 日本美女视频一区二区| 正在播放一区二区| 免费观看在线色综合| 4438亚洲最大| 美国精品在线观看| 精品国产一区二区三区av性色| 蜜桃视频第一区免费观看| 日韩欧美专区在线| 麻豆91在线观看| 精品国产乱码久久久久久夜甘婷婷| 久久精品国产在热久久| 日韩免费观看高清完整版| 免费在线观看一区| 精品免费国产二区三区| 韩国v欧美v日本v亚洲v| 久久这里只有精品首页| 国产成人免费视频| 国产精品麻豆欧美日韩ww| bt欧美亚洲午夜电影天堂| 亚洲男人的天堂av| 欧美日韩不卡一区| 麻豆91免费看| 中文字幕av在线一区二区三区| 成人福利在线看| 亚洲精品乱码久久久久| 制服丝袜一区二区三区| 精品综合免费视频观看| 国产欧美日韩三区| 色综合久久综合| 日产国产高清一区二区三区| 亚洲精品一区二区三区福利| 成人午夜av在线| 亚洲一区av在线| 日韩区在线观看| 国产成人a级片| 一区二区免费在线| 日韩无一区二区| 成人免费毛片高清视频| 一区二区三区中文字幕在线观看| 欧美日韩国产免费一区二区| 精品一区二区日韩| 中文字幕日本不卡| 91精品国产综合久久久蜜臀图片| 国产剧情一区在线| 一区二区三区免费观看| 日韩一区二区三区高清免费看看| 国产成人在线观看免费网站| 一区二区三区**美女毛片| 日韩欧美不卡在线观看视频| 白白色亚洲国产精品| 午夜av一区二区| 久久久91精品国产一区二区三区| 99久久婷婷国产综合精品电影| 五月天欧美精品| 国产视频一区二区在线| 欧美日韩一区二区不卡| 国产一区二区h| 亚洲最大成人综合| 国产日韩欧美综合在线| 欧美羞羞免费网站| 国产成人精品亚洲日本在线桃色| 亚洲国产美国国产综合一区二区| 久久久午夜精品理论片中文字幕| 91黄色免费网站| 国产高清久久久久| 五月婷婷综合网| 国产精品久久久久久久久免费相片| 欧美剧情片在线观看| eeuss鲁片一区二区三区在线观看| 日韩国产高清影视| 日韩理论片中文av| 亚洲精品一区二区三区香蕉| 欧美三级中文字| 99热在这里有精品免费| 久久99精品久久只有精品| 亚洲综合色视频| 国产精品女同一区二区三区| 91精品国产福利在线观看| 一本大道久久a久久精品综合| 国产一区二区三区四| 天堂va蜜桃一区二区三区漫画版| 成人免费在线播放视频| 26uuu欧美| 欧美一区二区三区喷汁尤物| 色哟哟欧美精品| 国产成人99久久亚洲综合精品| 蜜桃av噜噜一区| 亚洲图片欧美色图| 亚洲品质自拍视频| 亚洲国产精品精华液ab| 精品国产乱码久久久久久免费| 欧美日韩成人综合| 91久久精品网| 91女厕偷拍女厕偷拍高清| 福利一区在线观看| 黑人巨大精品欧美一区| 美美哒免费高清在线观看视频一区二区 | 久久精品这里都是精品| 日韩欧美国产一区在线观看| 精品视频色一区| 欧美专区日韩专区| 一本一道波多野结衣一区二区| 国产91在线观看丝袜| 国产一区二区三区最好精华液| 免费精品99久久国产综合精品| 午夜成人免费电影| 亚洲成人一区二区在线观看| 一区二区三区欧美视频| 亚洲男人电影天堂| 亚洲欧美国产毛片在线| 亚洲天堂av老司机| 亚洲日本成人在线观看| 亚洲视频每日更新| 中文字幕一区二区三| 国产精品福利一区二区三区| 国产精品美女久久久久久久久| 国产清纯白嫩初高生在线观看91| 久久久久久久电影| 日本一区二区三区在线观看| 国产欧美日韩一区二区三区在线观看| 久久久久国产成人精品亚洲午夜| 久久美女艺术照精彩视频福利播放 | 欧美专区日韩专区| 欧美日韩在线综合| 欧美日韩aaaaa| 777奇米四色成人影色区| 91精品国产色综合久久ai换脸| 欧美一区二视频| 日韩三级视频在线看| 精品国产乱码久久久久久久| 久久色视频免费观看| 国产亚洲制服色| 国产精品理伦片| 亚洲男人天堂一区| 午夜精品久久久久影视| 美女网站色91| 国产一区二区福利| 成人精品国产一区二区4080| 91麻豆精品秘密| 欧美三级韩国三级日本三斤| 在线不卡欧美精品一区二区三区| 欧美一区二区私人影院日本| 欧美大尺度电影在线| 久久色在线观看| 亚洲欧美另类在线| 午夜av电影一区| 国产麻豆精品在线观看| 福利视频网站一区二区三区| 99久久精品国产观看| 欧美日韩精品免费| 精品国产精品一区二区夜夜嗨| 中文字幕欧美区| 一区二区三区中文在线| 琪琪一区二区三区| 粉嫩av一区二区三区| 欧洲一区二区三区在线| 欧美一区二区大片| 中文字幕欧美三区| 亚洲国产成人91porn| 久久99蜜桃精品| 91影院在线免费观看| 欧美精品第1页| 国产亚洲精久久久久久| 亚洲综合一区在线| 久草在线在线精品观看| av午夜一区麻豆| 91精品国产欧美一区二区|