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

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

?? recv.c

?? wince3.0的源碼
?? C
字號:
/*++

Copyright (c) 1999-2000 Microsoft Corporation.  All rights reserved.

Module Name:

	recv.c

Abstract:

Environment:

--*/

#include "windows.h"
#include "tapi.h"
#include "ndis.h"
#include "ndiswan.h"
#include "ndistapi.h"
#include "asyncmac.h"
#include "frame.h"

#include "cclib.h"

//
//	The receive packet data buffer is allocated so as to contain:
//
//	1. 128 bytes of header space reserved for PPP Van Jacobsen TCP/IP header decompression, plus
//	2. 2 bytes for PPP protocol field, plus
//	3. MaxFrameSize (typically 1500) bytes of PPP frame data, plus
//  4. 2 bytes for a 16-bit CRC
//
//	Note that the recv packet buffer does not need to deal with escaped bytes or flags.
//	Those bytes are processed by the receive state machine and so are never stored in the receive packet buffer.
//	See RFC 1661 Section 6.1 description of Maximum-Receive-Unit
//
#define HEADER_BYTES_RESERVED_FOR_VAN_JACOBSEN_DECOMPRESSION	128
#define MAX_PROTOCOL_FIELD_LENGTH								2

//
//	Activesync 3.1 seems to send frames that are larger than the default MTU.
//	So, we add some extra bytes factor to allow it to work with this asyncmac driver.
//
#define ACTIVESYNC31_EXTRA_BYTES	50

#define TRAILER_BYTES_FOR_CRC									2
#define RECEIVE_PACKET_SIZE(pAdapter)	(HEADER_BYTES_RESERVED_FOR_VAN_JACOBSEN_DECOMPRESSION + \
										 MAX_PROTOCOL_FIELD_LENGTH + \
										(pAdapter)->Info.MaxFrameSize + \
										ACTIVESYNC31_EXTRA_BYTES + \
										TRAILER_BYTES_FOR_CRC)

void
ProcessEndOfPacket(
	PASYNCMAC_OPEN_LINE	pOpenLine,
	PBYTE				pRecvPacket,
	DWORD				cbPacketData)
//
//	Process packet data when the closing flag is received.
//
//	Check the CRC and indicate the the packet to the protocol if it is good.
//
{
	USHORT				CRCData;
	NDIS_STATUS			Status;
	PASYNCMAC_ADAPTER	pAdapter = pOpenLine->pAdapter;
	BOOLEAN				bGoodCRC = TRUE;

	DEBUGMSG (ZONE_FUNCTION | ZONE_RECV, (TEXT("AsyncMac: +ProcessEndOfPacket: length=%d\n"), cbPacketData));

	if (pOpenLine->WanLinkInfo.RecvFramingBits & PPP_FRAMING)
	{
		// Packet must contain at least 1 byte of data + 2 CRC bytes to be valid
		if (cbPacketData < (1 + TRAILER_BYTES_FOR_CRC))
		{
			DEBUGMSG (ZONE_RECV, (TEXT("MaxRxThread: Discarding short packet of length %d\n"), cbPacketData));
			return;
		}

		// Extract the 16 bit CRC from the last two bytes of the packet data
		// Note that the LSB of the CRC is transmitted first

		CRCData = (pRecvPacket[cbPacketData-1] << 8) | pRecvPacket[cbPacketData-2];
		CRCData ^= 0xFFFF;
		cbPacketData -= TRAILER_BYTES_FOR_CRC;

		// Validate the CRC

		bGoodCRC = CRCData == CalcCRCPPP (pRecvPacket, cbPacketData);
	}

	if (bGoodCRC)
	{
		DEBUGMSG (ZONE_RECV, (TEXT("AsyncMac: MaxRxThread: Have good packet\n")));

		NdisMWanIndicateReceive(&Status, pAdapter->hMiniportAdapter, pOpenLine->hNdisLinkContext, pRecvPacket, cbPacketData);
		NdisMWanIndicateReceiveComplete (pAdapter->hMiniportAdapter, pOpenLine->hNdisLinkContext);

		if (NDIS_STATUS_SUCCESS != Status)
		{
			DEBUGMSG (ZONE_ERROR, (TEXT("MacRxThread: ERROR: NdisMWanIndicateReceive Status=0x%X\n"), Status));
		}
	}
	else
	{
		DEBUGMSG (ZONE_RECV, (TEXT("AsyncMac: CRC Error 0x%X != 0x%X\n"),
					 CRCData, CalcCRCPPP (pRecvPacket, cbPacketData)));
	}
}

DWORD WINAPI
MacRxThread (LPVOID pVArg)
{
	PASYNCMAC_OPEN_LINE	pOpenLine;
	PBYTE				pRecvPacketStart,
						pRecvPacket,
						pRecvPacketCurrent,
						pRecvPacketEnd,
						pRecvBuffer;
	BOOL				bByteIsEscaped,
						bFrameTooLong,
						bPppFraming;
	COMMTIMEOUTS		CommTimeouts;
	DWORD				Error,
						cbRecvBuffer;

	// Establish a reference to openline
	pOpenLine = GetOpenLinePtr(pVArg);
	if (pOpenLine == NULL)
	{
		DEBUGMSG (ZONE_ERROR | ZONE_RECV, (TEXT("\n-MacRxThread: Unable to get reference to pOpenLine\n")));
		return 0;
	}

	ASSERT (CHK_AOL(pOpenLine));
	ASSERT (CHK_AA(pOpenLine->pAdapter));
	ASSERT (pOpenLine->hPort != NULL);
	
	bPppFraming = (pOpenLine->WanLinkInfo.RecvFramingBits & PPP_FRAMING) != 0;

	// We are interested in the following events on the comm port:
	//		EV_RXCHAR - data has been received
	//		EV_RLSD	  - carrier detect line changed state
	//		EV_POWER  - WinCE power event (port powered down)

	SetCommMask(pOpenLine->hPort, EV_RXCHAR | EV_RLSD | EV_POWER );	

	// Configure the port timeouts to:
	//		1. Return immediately on a ReadFile (that is, do not block waiting for bytes to arrive)
	//		2. Allow 500 ms + 2ms/byte before timing out a WriteFile

    GetCommTimeouts( pOpenLine->hPort, &CommTimeouts );
    CommTimeouts.ReadIntervalTimeout = MAXDWORD;
    CommTimeouts.ReadTotalTimeoutMultiplier = 0;
    CommTimeouts.ReadTotalTimeoutConstant = 0;
    CommTimeouts.WriteTotalTimeoutMultiplier = 2;
    CommTimeouts.WriteTotalTimeoutConstant = 500;
    SetCommTimeouts( pOpenLine->hPort, &CommTimeouts );

	//
	//	Allocate the receive packet that we will fill in and indicate to PPP.
	//
	pRecvPacketStart = AsyncMacAllocateMemory(RECEIVE_PACKET_SIZE(pOpenLine->pAdapter));
	if (pRecvPacketStart == NULL)
	{
		DEBUGMSG (ZONE_RECV, (TEXT("MacRxThread: Unable to allocate RecvPacket %d bytes\n"), RECEIVE_PACKET_SIZE(pOpenLine->pAdapter)));
		CloseHandle( pOpenLine->hRxThrd);
		pOpenLine->hRxThrd = NULL;
		ReleaseOpenLinePtr(pOpenLine);
		return 0;
	}

	//
	//	Allocate the receive buffer passed to ReadFile to retrieve bytes from serial port.
	//
	cbRecvBuffer = pOpenLine->pAdapter->dwRecvBufSize;
	pRecvBuffer = AsyncMacAllocateMemory(cbRecvBuffer);
	if (pRecvBuffer == NULL)
	{
		DEBUGMSG (ZONE_RECV, (TEXT("MacRxThread: Unable to allocate RecvBuffer %d bytes\n"), cbRecvBuffer));
		CloseHandle( pOpenLine->hRxThrd);
		pOpenLine->hRxThrd = NULL;
		AsyncMacFreeMemory (pRecvPacketStart, RECEIVE_PACKET_SIZE(pOpenLine->pAdapter));
		ReleaseOpenLinePtr(pOpenLine);
		return 0;
	}

	// Get a pointer to the portion of the receive packet that gets filled in by AsyncMac
	pRecvPacket = pRecvPacketStart + HEADER_BYTES_RESERVED_FOR_VAN_JACOBSEN_DECOMPRESSION;

	pRecvPacketEnd = pRecvPacketStart + RECEIVE_PACKET_SIZE(pOpenLine->pAdapter);
	bByteIsEscaped = FALSE;
	pRecvPacketCurrent = pRecvPacket;
	bFrameTooLong = TRUE;				// Setting this TRUE forces us to see a flag byte (0x7E) before first packet

	while (pOpenLine->dwFlags & AOL_FLAGS_SENT_LINE_UP)
	{
		DWORD				Mask;
		DWORD				ModemStatus;

		DEBUGMSG (ZONE_RECV, (TEXT("AsyncMac: WaitCommEvent...\n"), Mask));

		if ( WaitCommEvent( pOpenLine->hPort, &Mask, NULL ) == TRUE )
		{
			ASSERT(AsyncMacGuardRegionOk(pOpenLine, sizeof(ASYNCMAC_OPEN_LINE)));
			ASSERT(AsyncMacGuardRegionOk(pOpenLine->pAdapter, sizeof(ASYNCMAC_ADAPTER)));
			ASSERT(AsyncMacGuardRegionOk(pRecvPacketStart, RECEIVE_PACKET_SIZE(pOpenLine->pAdapter)));

			DEBUGMSG (ZONE_RECV, (TEXT("AsyncMac: ...WaitCommEvent returned: Mask=0x%X\n"), Mask));

			if (Mask & (EV_POWER | EV_RLSD))
			{
				// Power loss/DCD change of state Detection

				ModemStatus = 0;
				(void)GetCommModemStatus(pOpenLine->hPort, &ModemStatus);

				if ((Mask & EV_POWER) || !(ModemStatus & MS_RLSD_ON))
				{
					DEBUGMSG( ZONE_RECV | ZONE_ERROR,( TEXT( "AsyncMac: Power=%hs CD=%hs\n"),
						Mask & EV_POWER ? "OFF" : "ON", ModemStatus & MS_RLSD_ON ? "ON" : "OFF"));

					// Indicate Mac down due to loss of power or carrier detect (CD)

					SendLineDown(pOpenLine);
					break;
				}
			}

			if (Mask & EV_RXCHAR)
			{
				// Receive data event

				BYTE	byte;
				DWORD	cbReceiveData, dwBytesRead;
				PBYTE	pbReceiveData;


				DEBUGMSG(ZONE_RECV, (TEXT( "AsyncMac:RX avail\n" )));

                // Read & process data till no more is available.
                do {
				pbReceiveData = pRecvBuffer;
				if (ReadFile(pOpenLine->hPort, pbReceiveData, cbRecvBuffer, &cbReceiveData, 0 ) == FALSE)
				{
					// Serial functions will return an error if a PCMCIA card has
					// been removed. If the error is INVALID_HANDLE or GEN_FAILURE
					// the PCMCIA card was removed. In this case the MAC layer is
					// down.

					Error = GetLastError();
					DEBUGMSG( ZONE_RECV | ZONE_ERROR, (TEXT( "AsyncMac:ReadFile failed %d\n"), Error));

					if( ((ERROR_INVALID_HANDLE == Error)  || Error == ERROR_GEN_FAILURE)
					&& 	!(pOpenLine->dwFlags & AOL_FLAGS_ERROR_INDICATED) )
					{
						pOpenLine->dwFlags |= AOL_FLAGS_ERROR_INDICATED;
						SendLineDown (pOpenLine);
					}
					goto SerialError;
				}

                dwBytesRead = cbReceiveData;
                
				DEBUGMSG(ZONE_RECV, (TEXT("->mac:RX %d bytes, spaceLeft=%d pCurr=%x\n" ), cbReceiveData, pRecvPacketEnd - pRecvPacketCurrent, pRecvPacketCurrent));
#ifdef DEBUG
				if (ZONE_RECV)
				{
					DEBUGMSG(1, (TEXT("\nAsyncMac ReadFile:\n")));
					DumpMem(pbReceiveData, cbReceiveData);
					DEBUGMSG(1, (TEXT("\n\n")));
				}
#endif

				// Run the data through the RX packet state machine
				//
				// Note that the state machine does not distinguish between opening and closing
				// flags.  Any flag both terminates a current packet (if any) and begins a new
				// packet.  This allows a shared opening/closing flag between packets.

				while (cbReceiveData--)
				{
					byte = *pbReceiveData++;

					//
					//	Note the sequence ESC FLAG is illegal, so we don't care whether
					//	we are in the escaped state or not when checking for a flag.
					//
					if ( bPppFraming && byte == PPP_FLAG_BYTE
					|| (!bPppFraming && byte == SLIP_END))
					{
						if (pRecvPacketCurrent > pRecvPacket && !bFrameTooLong)
						{
							// Indicate the packet to the protocol as appropriate
							ASSERT(AsyncMacGuardRegionOk(pRecvPacketStart, RECEIVE_PACKET_SIZE(pOpenLine->pAdapter)));
							ProcessEndOfPacket(pOpenLine, pRecvPacket, pRecvPacketCurrent - pRecvPacket);
							ASSERT(AsyncMacGuardRegionOk(pRecvPacketStart, RECEIVE_PACKET_SIZE(pOpenLine->pAdapter)));
						}

						// Reinitialize state for the next packet
						pRecvPacketCurrent = pRecvPacket;
						bFrameTooLong = FALSE;
						bByteIsEscaped = FALSE;
					}
					else if ( bPppFraming && byte == PPP_ESC_BYTE
						 || (!bPppFraming && byte == SLIP_ESC))
					{
						bByteIsEscaped = TRUE;
					}
					else // Just a regular byte
					{
						// Check that there is space left to store the byte

						if (pRecvPacketCurrent < pRecvPacketEnd)
						{
							if (bByteIsEscaped)
							{
								if (bPppFraming)
								{
									byte ^= 0x20;
								}
								else // SLIP
								{
									if (byte == SLIP_ESC_ESC)
										byte = SLIP_ESC;
									else if (byte == SLIP_ESC_END)
										byte = SLIP_END;
								}
								bByteIsEscaped = FALSE;
							}
							*pRecvPacketCurrent++ = byte;
						}
						else // no space left -- frame too long
						{
							DEBUGMSG (!bFrameTooLong && ZONE_ERROR,
								(TEXT("AsyncMac: MacRxThread-ERROR: Packet too long (pCurr=%x byte=%02x, offset=%d), tossing\n"),
								pRecvPacketCurrent, byte, pbReceiveData - pRecvBuffer));
							bFrameTooLong = TRUE;
						}
					}
				} // while (cbReceiveData--)
				DEBUGMSG( ZONE_RECV, (TEXT( "Mac: RecvPacket size now %d bytes, pCurr=%x\n"), pRecvPacketCurrent - pRecvPacket, pRecvPacketCurrent));

				}while( dwBytesRead );
				
			}
		}
		else // WaitCommEvent did not return TRUE
		{
			Error = GetLastError();

			DEBUGMSG( ZONE_RECV | ZONE_ERROR, (TEXT( "Mac:WaitCommEvent failed %d\n"), Error ));

			// Serial functions will return an error if a PCMCIA card has
			// been removed. If the error is INVALID_HANDLE or GEN_FAILURE
			// the PCMCIA card was removed. In this case the MAC layer is
			// down.

			if( (Error == ERROR_INVALID_HANDLE
			||	 Error == ERROR_GEN_FAILURE)
			&& 	!(pOpenLine->dwFlags & AOL_FLAGS_ERROR_INDICATED) )
			{
				pOpenLine->dwFlags |= AOL_FLAGS_ERROR_INDICATED;
				//            MacNotifyDown( pOpenLine, ERROR_DEVICE_NOT_READY );
				SendLineDown (pOpenLine);
			}
			goto SerialError;
		}
	}

SerialError:
	CloseHandle( pOpenLine->hRxThrd);
	pOpenLine->hRxThrd = NULL;
	
	AsyncMacFreeMemory (pRecvBuffer, cbRecvBuffer);
	AsyncMacFreeMemory (pRecvPacketStart, RECEIVE_PACKET_SIZE(pOpenLine->pAdapter));
	ReleaseOpenLinePtr(pOpenLine);

	DEBUGMSG (ZONE_RECV, (TEXT("\nAsyncMac: -MacRxThread: Exiting\n")));
	return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧美一区二区在线观看| 国产日产欧美精品一区二区三区| 国产成人综合在线观看| 一区二区三国产精华液| 国产农村妇女毛片精品久久麻豆 | 欧美三级三级三级| 国产精品羞羞答答xxdd| 婷婷综合久久一区二区三区| 中文字幕在线一区免费| 久久在线免费观看| 精品亚洲成av人在线观看| 精品999在线播放| 欧美日韩色一区| 在线观看视频一区| 成人a免费在线看| 国模冰冰炮一区二区| 视频一区视频二区在线观看| 一区二区久久久久| 中文字幕在线一区| 久久精品一区二区三区四区| 精品三级av在线| 欧美一区二区三区四区久久| 欧美午夜一区二区| 在线亚洲一区二区| 色综合久久88色综合天天免费| 精品一区二区三区久久| 蜜臂av日日欢夜夜爽一区| 五月婷婷综合激情| 亚洲激情av在线| 亚洲欧美一区二区三区极速播放 | 一区二区成人在线视频| 国产精品看片你懂得| 国产欧美一区二区精品性| 欧美精品一区二区三区在线播放| 欧美一区二区在线免费观看| 欧美视频自拍偷拍| 欧美亚洲免费在线一区| 欧美揉bbbbb揉bbbbb| 色美美综合视频| 91蜜桃网址入口| 色94色欧美sute亚洲线路二| 色丁香久综合在线久综合在线观看| aaa国产一区| 972aa.com艺术欧美| 色94色欧美sute亚洲线路一ni | 精品伊人久久久久7777人| 奇米一区二区三区| 老司机精品视频在线| 精品一区免费av| 国产精品99久久久久久宅男| 国产精品亚洲一区二区三区在线| 国产成人综合网站| 99久久综合狠狠综合久久| 一本久久a久久精品亚洲| 色天天综合久久久久综合片| 91久久精品日日躁夜夜躁欧美| 在线中文字幕一区二区| 884aa四虎影成人精品一区| 欧美变态tickle挠乳网站| 久久久国产精品不卡| 国产精品伦一区二区三级视频| 国产精品国产三级国产普通话99| 一区二区三区小说| 全部av―极品视觉盛宴亚洲| 国模大尺度一区二区三区| 成人动漫视频在线| 欧美视频一区二区三区| 精品国产一区二区三区久久影院| 国产欧美一区在线| 夜夜揉揉日日人人青青一国产精品| 日日夜夜免费精品| 国产成人精品aa毛片| 欧美亚洲一区二区在线| 欧美mv和日韩mv的网站| 中文字幕在线不卡一区二区三区| 亚洲一区二区中文在线| 免费xxxx性欧美18vr| 国产乱码精品1区2区3区| 91蜜桃免费观看视频| 欧美一级高清大全免费观看| 欧美—级在线免费片| 午夜久久久久久| 成人av影视在线观看| 日韩一区二区三区精品视频| 日本一区二区三区四区| 亚洲自拍偷拍图区| 国产一区二区精品久久91| 色狠狠综合天天综合综合| 精品国产一区二区精华| 亚洲品质自拍视频网站| 激情av综合网| 欧美欧美欧美欧美| 1000精品久久久久久久久| 国产在线国偷精品产拍免费yy| 91性感美女视频| 久久久久久久精| 日韩**一区毛片| 91一区一区三区| 国产亚洲精品bt天堂精选| 亚洲福利国产精品| 91视频观看免费| 国产亚洲精品资源在线26u| 天天综合网 天天综合色| 色综合久久久网| 国产人成一区二区三区影院| 免费人成在线不卡| 欧美在线看片a免费观看| 中文字幕第一区二区| 国产自产v一区二区三区c| 欧美日韩在线播放一区| 最好看的中文字幕久久| 国产另类ts人妖一区二区| 4438x成人网最大色成网站| 亚洲黄色录像片| av一区二区三区四区| 久久久久久**毛片大全| 毛片av一区二区三区| 3atv一区二区三区| 五月天激情综合| 欧美视频一区二区在线观看| 亚洲美女在线国产| 91丨porny丨国产| 国产精品久久一级| 成人禁用看黄a在线| 亚洲国产激情av| 高清在线不卡av| 欧美激情一区在线观看| 国产成人午夜片在线观看高清观看| 日韩欧美二区三区| 蜜桃视频免费观看一区| 日韩视频在线永久播放| 亚洲va中文字幕| 日日嗨av一区二区三区四区| 欧美日韩激情一区二区三区| 美女在线观看视频一区二区| 亚洲精品一线二线三线无人区| 国产成人亚洲综合a∨猫咪| 日韩理论片网站| 欧美色中文字幕| 国产精品99久久久久久久女警 | 欧美三级午夜理伦三级中视频| 91首页免费视频| jvid福利写真一区二区三区| 日韩精品视频网| 亚洲欧美在线aaa| 久久精品一级爱片| 一本大道av伊人久久综合| 亚洲免费伊人电影| 亚洲人成在线观看一区二区| 这里只有精品视频在线观看| 国产亚洲综合性久久久影院| 国产乱码精品一区二区三 | 亚洲精品在线三区| 国产成人精品一区二| 中文字幕一区二区在线播放| 91麻豆国产自产在线观看| 亚洲大型综合色站| 日韩一区二区视频在线观看| 国产精品亚洲第一区在线暖暖韩国| 国产精品美女视频| 欧美性极品少妇| 久久精品免费观看| 国产欧美一区二区三区网站| 在线视频欧美精品| 美腿丝袜一区二区三区| 国产女人水真多18毛片18精品视频| 色综合久久久久综合| 日本欧美一区二区| 国产亚洲婷婷免费| 欧美性大战久久久久久久蜜臀| 五月婷婷另类国产| 日本一二三四高清不卡| 色8久久人人97超碰香蕉987| 日本欧美在线看| 《视频一区视频二区| 欧美一级免费大片| av中文字幕不卡| 日韩av不卡在线观看| 国产精品国产馆在线真实露脸 | 26uuu欧美| 91黄色免费版| 国产福利91精品一区| 亚洲高清一区二区三区| 国产欧美一区二区三区网站| 欧美日韩成人激情| 成人精品小蝌蚪| 午夜欧美大尺度福利影院在线看| 欧美韩国一区二区| 91精品国产一区二区三区香蕉| 99riav一区二区三区| 国内精品自线一区二区三区视频| 怡红院av一区二区三区| 欧美高清在线精品一区| 6080午夜不卡| 日本伦理一区二区| 国产精品亚洲人在线观看| 青草av.久久免费一区| 亚洲色图丝袜美腿| 久久亚洲一区二区三区明星换脸 | 成人免费一区二区三区在线观看|