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

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

?? tapifun.c

?? wince3.0的源碼
?? C
字號:
/* Copyright (c) 1999-2000 Microsoft Corporation.  All rights reserved. */
#include "windows.h"
#include "ndis.h"
#include "ndiswan.h"
#include "tapi.h"
#include "ndistapi.h"
#include "asyncmac.h"
#include "windev.h"		// For IsAPIReady()

#define DEV_CLASS_COMM_DATAMODEM TEXT("comm/datamodem")

// ----------------------------------------------------------------
//
//
//	@func	DWORD	|	TapiLineGetID |
//			Get the handle to the underlying serial port.
//
//	@rdesc	Returns the port handle or INVALID_HANDLE_VALUE.
//
//	@parm	HCALL	|	hCall	| The handle to the call
//
//	@comm
//			This function will get the handle to the underlying port of
//			a TAPI call.  This can be used by ReadFile/WriteFile etc.
//
//	@ex		An example of how to use this function follows |
//			No Example
//
//
HANDLE
TapiLineGetID(HLINE hLine, HCALL hCall)
{
	LPVARSTRING	pVStr;
	long 		lReturn;
	DWORD		dwNeededSize;
	DWORD		dwPortID = (DWORD)INVALID_HANDLE_VALUE;

	DEBUGMSG (ZONE_FUNCTION,
			  (TEXT("+TapilineGetID(0x%X, 0x%X)\r\n"), hLine, hCall));

	dwNeededSize = sizeof(VARSTRING);
	while (1) {
		pVStr = (LPVARSTRING)LocalAlloc (LPTR, dwNeededSize);
		if (NULL == pVStr) {
			break;
		}
		pVStr->dwTotalSize = dwNeededSize;
		lReturn = lineGetID(hLine, 0, hCall, LINECALLSELECT_CALL,
							pVStr, DEV_CLASS_COMM_DATAMODEM);

		if (lReturn) {
			DEBUGMSG (ZONE_ERROR,
					 (TEXT(" lineGetID returned 0x%X\r\n"),
					  lReturn));
			LocalFree (pVStr);
			pVStr = NULL;
			break;
		}

		if (pVStr->dwNeededSize > pVStr->dwTotalSize) {
			dwNeededSize = pVStr->dwNeededSize;
			LocalFree (pVStr);
			pVStr = NULL;
			continue;
		}
		break;
	}

	if (pVStr) {
		dwPortID = *((LPDWORD)((LPBYTE)pVStr + pVStr->dwStringOffset));
		DEBUGMSG (ZONE_FUNCTION,
				  (TEXT(" TapilineGetID ID=0x%X\r\n"), dwPortID));
		LocalFree (pVStr);
	}
	DEBUGMSG (ZONE_FUNCTION,
			  (TEXT("-TapilineGetID Returning 0x%X\r\n"), dwPortID));
	return (HANDLE)dwPortID;
}

void
SendLineDown(
	PASYNCMAC_OPEN_LINE pOpenLine)
{
	NDIS_MAC_LINE_DOWN	MacLineDown;
	PASYNCMAC_ADAPTER	pAdapter;

	ASSERT (CHK_AOL(pOpenLine));
	pAdapter = pOpenLine->pAdapter;
	ASSERT (CHK_AA(pAdapter));

	if (!(pOpenLine->dwFlags & AOL_FLAGS_SENT_LINE_UP))
	{
		RETAILMSG (1, (TEXT("SendLineDown: Can't send line down if we never sent a line up\n")));
	}
	else
	{
		memset ((char *)&MacLineDown, 0, sizeof(MacLineDown));
		MacLineDown.NdisLinkContext = pOpenLine->hNdisLinkContext;

		NdisMIndicateStatus (pAdapter->hMiniportAdapter,
							 NDIS_STATUS_WAN_LINE_DOWN,
							 &MacLineDown, sizeof(MacLineDown));
		
		// Turn off the flag
		pOpenLine->dwFlags &= ~(AOL_FLAGS_SENT_LINE_UP);
	}	
}


// -----------------------------------------------------------------------------
//
//  FUNCTION: lineCallbackFunc(..)
//
//  PURPOSE: Receive asynchronous TAPI events
//
//  PARAMETERS:
//    dwDevice  - Device associated with the event, if any
//    dwMsg     - TAPI event that occurred.
//    dwCallbackInstance - User defined data supplied when opening the line.
//    dwParam1  - dwMsg specific information
//    dwParam2  - dwMsg specific information
//    dwParam3  - dwMsg specific information
//
//  RETURN VALUE:
//    none
//
//  COMMENTS:
//    This is the function where all asynchronous events will come.
//    Almost all events will be specific to an open line, but a few
//    will be general TAPI events (such as LINE_REINIT).
//
//
// -----------------------------------------------------------------------------
void CALLBACK
lineCallbackFunc(DWORD dwDevice, DWORD dwMsg, DWORD dwCallbackInstance,
                 DWORD dwParam1, DWORD dwParam2, DWORD dwParam3)
{
	PASYNCMAC_OPEN_LINE	pOpenLine = (PASYNCMAC_OPEN_LINE)dwCallbackInstance;
	PASYNCMAC_ADAPTER	pAdapter;
	NDIS_TAPI_EVENT		TapiEvent;
	NDIS_MAC_LINE_UP	MacLineUp;
	DWORD				dwID;

    DEBUGMSG (ZONE_FUNCTION,
              (TEXT("+lineCallbackFunc(0x%X, %d, %d, 0x%X, 0x%X, 0x%X)\r\n"),
               dwDevice, dwMsg, dwCallbackInstance,
               dwParam1, dwParam2, dwParam3));

	TapiEvent.htLine = 0;
	TapiEvent.htCall = 0;
	TapiEvent.ulMsg = dwMsg;
	TapiEvent.ulParam1 = dwParam1;
	TapiEvent.ulParam2 = dwParam2;
	TapiEvent.ulParam3 = dwParam3;

	if (dwMsg == LINE_CREATE)
	{
		extern PASYNCMAC_ADAPTER	v_pAdapter;

		// A new TAPI device like a PCMCIA card modem has been created.
		// Note that TAPI devices never go away, so their is no LINE_DESTROY message.
		DEBUGMSG (ZONE_FUNCTION, (TEXT(" lineCallbackFunc: LINE_CREATE\n")));

		if (v_pAdapter != NULL)
		{
			// Inform the protocol that the count of devices has changed.

			NdisMIndicateStatus (v_pAdapter->hMiniportAdapter,
								 NDIS_STATUS_TAPI_INDICATION,
								 &TapiEvent, sizeof(NDIS_TAPI_EVENT));
		}
		DEBUGMSG (ZONE_FUNCTION, (TEXT("-lineCallbackFunc\n")));
		return;
	}

	if (0 == dwCallbackInstance) {
		DEBUGMSG (ZONE_ERROR, (TEXT("-lineCallbackFunc: dwCallbackInstance==NULL\r\n")));
		return;
	}

	if (NULL == (pOpenLine = GetOpenLinePtr ((void *)dwCallbackInstance))) {
		DEBUGMSG (ZONE_ERROR, (TEXT("-lineCallbackFunc: dwCallbackInstance(0x%X) not a valid pOpenLine\r\n"),
							  dwCallbackInstance));
		return;
	}

	ASSERT (CHK_AOL(pOpenLine));
	pAdapter = pOpenLine->pAdapter;
	ASSERT (CHK_AA(pAdapter));

	switch (dwMsg)
	{
	case LINE_CALLINFO:
		// Information about the call has changed.
		break;

	case LINE_CALLSTATE :
		// Save away the callstate
		pOpenLine->dwCallState = dwParam1;
		switch (dwParam1) {
		case LINECALLSTATE_CONNECTED :
			DEBUGMSG(ZONE_INTERFACE, (TEXT("LINECALLSTATE_CONNECTED\n")));
			// Let's get the handle to the serial port.
			pOpenLine->hPort = TapiLineGetID(pOpenLine->hLine, pOpenLine->hCall);

			ASSERT (pOpenLine->hRxThrd == NULL);

			// Keep track of the line up.
			pOpenLine->dwFlags |= AOL_FLAGS_SENT_LINE_UP;
			
			pOpenLine->hRxThrd = CreateThread (NULL, 0, MacRxThread, pOpenLine, 0, &dwID);

			ASSERT (pOpenLine->hRxThrd != INVALID_HANDLE_VALUE);

			// Set the receive thread priority
			CeSetThreadPriority(pOpenLine->hRxThrd, pAdapter->dwRecvThreadPrio);

			memset ((char *)&MacLineUp, 0, sizeof(MacLineUp));
			MacLineUp.LinkSpeed = pOpenLine->dwBaudRate;
			//	TODO	MacLineUp.Quality =
			MacLineUp.SendWindow = 1;
			MacLineUp.ConnectionWrapperID = (NDIS_HANDLE)pOpenLine->htCall;
			MacLineUp.NdisLinkHandle = pOpenLine;

			NdisMIndicateStatus (pAdapter->hMiniportAdapter,
								 NDIS_STATUS_WAN_LINE_UP,
								 &MacLineUp, sizeof(MacLineUp));
			
			// Save the NdisLinkContext;
			pOpenLine->hNdisLinkContext = MacLineUp.NdisLinkContext;

			break;

		case LINECALLSTATE_IDLE :
			DEBUGMSG(ZONE_INTERFACE, (TEXT("ASYNCMAC: LINECALLSTATE_IDLE\n")));
			if (pOpenLine->dwFlags & AOL_FLAGS_SENT_LINE_UP) {
				SendLineDown (pOpenLine);
				// Kill recv thread.
				while (pOpenLine->hRxThrd) {
					DEBUGMSG (ZONE_TAPI, (TEXT(" lineCallbackFunc: Calling SetCommMask\n")));
					if (SetCommMask (pOpenLine->hPort, 0) == FALSE)
					{
						// Port is invalid
						DEBUGMSG (ZONE_ERROR, (TEXT(" lineCallbackFunc: SetCommMask failed, error=%d\n"), GetLastError()));
						break;
					}
					Sleep (20);
				}
			}
			break;

		case LINECALLSTATE_DISCONNECTED:
			DEBUGMSG (ZONE_FUNCTION, (TEXT(" lineCallbackFunc: LINECALLSTATE_DISCONNECTED\n")));
			break;

		default :
			DEBUGMSG (1, (TEXT(" lineCallbackFunc: Unhandled LINE_CALLSTATE Callback %d\n"), dwParam1));
			break;
		}
		break;
	case LINE_REPLY :
        //
        // dwParam2 has the error code.  If non-zero then something bad has happened.
        //
        if (dwParam2) {
			// Tell the caller that this failed.
//            SetEvent (s_p->TapiEvent);
        }
		break;

	default :
		DEBUGMSG (1, (TEXT(" lineCallbackFunc: Unhandled callback %d\r\n"), dwMsg));
		break;
	}

	// Let's just let the NDISWAN layer know what happened
	if (pOpenLine->hCall) {

		// Check again just in case we had to wait for the lock......
		if (pOpenLine->hCall) {
			TapiEvent.htLine = pOpenLine->htLine;
			TapiEvent.htCall = pOpenLine->htCall;

			NdisMIndicateStatus (pAdapter->hMiniportAdapter,
								 NDIS_STATUS_TAPI_INDICATION,
								 &TapiEvent, sizeof(NDIS_TAPI_EVENT));
		}

	}
	ReleaseOpenLinePtr (pOpenLine);
    DEBUGMSG (ZONE_FUNCTION, (TEXT("-lineCallbackFunc\r\n")));
    return;
}

VOID NDISAPI
DoLineInitialize(PVOID SystemSpecific1,
				 PVOID FunctionContext,
				 PVOID SystemSpecific2,
				 PVOID SystemSpecific3)
{
	PASYNCMAC_ADAPTER	pAdapter = (PASYNCMAC_ADAPTER)FunctionContext;
	long				lReturn;
	NDIS_TAPI_EVENT		TapiEvent;
	DWORD				i;
	LINEEXTENSIONID		lineExtensionID;

	if (IsAPIReady(SH_TAPI)) {
		// Sleep an extra 5 seconds anyway, why?  I don't know but it seems
		// like a good idea, this allows all of the initial devices to be
		// created.
		Sleep(5000);
		lReturn = lineInitialize (&(pAdapter->hLineApp),
								  v_hInstance, lineCallbackFunc, 
								  TEXT("ASYNCMAC"), &(pAdapter->dwNumDevs));

		if (lReturn == 0) {
			DEBUGMSG (1, (TEXT("lineInitialize say's there's %d devices\r\n"),
						  pAdapter->dwNumDevs));

			// Let's figure out the version number to use?
			// We'll just ask for device 0?
			if (lineNegotiateAPIVersion(pAdapter->hLineApp, 0,
				TAPI_CURRENT_VERSION, TAPI_CURRENT_VERSION,  
				&(pAdapter->dwAPIVersion), &lineExtensionID))  {
				DEBUGMSG (1, (TEXT("Error from lineNegotiateAPIVersion?\r\n")));
			}
			

			// Now inform PPP that we have new devices
			memset ((char *)&TapiEvent, 0, sizeof(TapiEvent));
			//TapiEvent.htLine = 0;
			//TapiEvent.htCall = 0;
			TapiEvent.ulMsg = LINE_CREATE;
			for (i=0; i < pAdapter->dwNumDevs; i++) {
				// Indicate device num
				TapiEvent.ulParam1 = i;
				NdisMIndicateStatus(pAdapter->hMiniportAdapter, NDIS_STATUS_TAPI_INDICATION, &TapiEvent, sizeof(TapiEvent));
			}
		}

		DEBUGMSG (ZONE_ERROR && lReturn,
				  (TEXT("ASYNCMAC: Error %d from lineInitialize\r\n")));

	} else {
		DEBUGMSG (1, (TEXT("ASYNCMAC:Tapi not ready yet... Resetting Timer\r\n")));
		NdisMSetTimer (&(pAdapter->ntLineInit), 1000);
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久人人爽爽爽人久久久| 欧美日韩国产精品自在自线| 久久久久久综合| 狠狠网亚洲精品| 久久精品一区八戒影视| 国产成人精品免费看| 国产日产欧美一区二区三区| 国产suv一区二区三区88区| 国产精品久久免费看| 欧美最新大片在线看| 婷婷综合另类小说色区| 91精品国产综合久久精品麻豆| 天天综合日日夜夜精品| 欧美精品一区二区在线观看| 国产91在线观看丝袜| 亚洲码国产岛国毛片在线| 欧美日韩亚洲综合| 久久精品久久精品| 国产精品电影一区二区三区| 欧美日韩国产一二三| 国模大尺度一区二区三区| 国产精品不卡在线观看| 欧美调教femdomvk| 国内欧美视频一区二区| 亚洲色图色小说| 日韩欧美中文字幕一区| 成人黄色网址在线观看| 亚洲国产sm捆绑调教视频 | 日韩精品视频网| 国产视频亚洲色图| 色哟哟一区二区三区| 久久精品国产77777蜜臀| 日韩毛片精品高清免费| 日韩视频在线观看一区二区| aaa国产一区| 免费人成网站在线观看欧美高清| 国产拍揄自揄精品视频麻豆| 欧美日韩亚洲综合一区 | 午夜久久电影网| 国产欧美一二三区| 7777精品伊人久久久大香线蕉超级流畅| 国产精品影视在线| 蜜臀av一区二区在线观看 | 91在线观看美女| 日日骚欧美日韩| 综合激情成人伊人| 精品久久人人做人人爰| 欧美性大战xxxxx久久久| 国产精品123| 久久精品99国产精品| 有码一区二区三区| 亚洲国产精品99久久久久久久久| 欧美日韩国产天堂| 91麻豆免费观看| 国产jizzjizz一区二区| 六月丁香婷婷久久| 亚洲成人免费看| 亚洲精品视频一区| 《视频一区视频二区| 久久久蜜桃精品| 日韩欧美你懂的| 91麻豆精品国产91久久久资源速度| 色美美综合视频| 97se亚洲国产综合自在线| 国产剧情一区二区| 国产主播一区二区| 韩国欧美国产1区| 久久国产精品一区二区| 日韩和的一区二区| 日韩影院免费视频| 日韩精品一区第一页| 天堂久久一区二区三区| 午夜精品久久久久久不卡8050| 一区二区三区蜜桃| 亚洲国产日韩精品| 亚洲mv在线观看| 精品一二三四区| 久久国产欧美日韩精品| 日韩电影在线观看电影| 日本不卡一区二区| 视频一区在线播放| 日韩国产欧美在线观看| 日韩高清不卡一区二区三区| 日本成人在线电影网| 久久精品国产77777蜜臀| 国内一区二区视频| 成人性视频免费网站| 成人黄色在线看| 一本久久精品一区二区| 精品1区2区3区| 91精品欧美综合在线观看最新 | 欧美美女bb生活片| 91.xcao| 日韩女优av电影| 国产婷婷色一区二区三区在线| 欧美激情综合在线| 亚洲欧美国产毛片在线| 一区二区三区美女视频| 天堂在线亚洲视频| 国产精品一区二区在线播放| 成人av集中营| 欧美私人免费视频| 精品日韩在线观看| 国产精品毛片高清在线完整版| 日韩码欧中文字| 日本在线不卡一区| 成人中文字幕电影| 在线免费观看日韩欧美| 日韩一区二区电影网| 国产三级一区二区| 一区二区三区毛片| 精品一区二区三区在线播放视频| 国产99精品在线观看| 欧美色区777第一页| 精品国产百合女同互慰| 亚洲色图在线视频| 麻豆国产欧美日韩综合精品二区| 国产成都精品91一区二区三| 欧美亚洲综合另类| 久久一区二区视频| 亚洲一区二区三区四区在线观看 | 《视频一区视频二区| 青青草国产成人av片免费| 成人黄色片在线观看| 91精品国产免费| 亚洲欧洲精品一区二区精品久久久| 亚洲成精国产精品女| 国产91精品久久久久久久网曝门| 欧美三级日韩在线| 中文字幕第一区二区| 秋霞影院一区二区| 日本二三区不卡| 久久久综合激的五月天| 舔着乳尖日韩一区| 99久久99久久综合| 久久久99免费| 日韩和的一区二区| 色噜噜久久综合| 国产欧美日韩在线视频| 美女高潮久久久| 欧美日韩在线播放三区四区| 国产精品第13页| 91麻豆国产福利在线观看| 日韩精品一区二区三区三区免费 | 欧美男女性生活在线直播观看| 欧美激情一区在线| 激情久久久久久久久久久久久久久久| 99精品欧美一区二区三区小说| 久久一区二区视频| 日韩成人午夜精品| 欧美日韩五月天| 亚洲精品videosex极品| 波多野结衣中文字幕一区二区三区| 欧美va亚洲va香蕉在线| 欧美a一区二区| 日韩欧美的一区二区| 亚洲人123区| 不卡一区二区三区四区| 久久午夜羞羞影院免费观看| 男女男精品视频| 91精品国产欧美一区二区| 日韩精品国产精品| 欧美精品一卡二卡| 日韩高清在线一区| 日韩亚洲欧美高清| 日本v片在线高清不卡在线观看| 欧美日韩国产一级| 五月天久久比比资源色| 欧美剧情电影在线观看完整版免费励志电影| 亚洲三级免费电影| 色播五月激情综合网| 亚洲国产视频直播| 欧美日韩在线播放三区四区| 亚洲高清在线精品| 欧美精品v日韩精品v韩国精品v| 午夜在线成人av| 91精品国产综合久久精品麻豆| 午夜av一区二区三区| 日韩一卡二卡三卡| 加勒比av一区二区| 欧美国产丝袜视频| 91亚洲精品乱码久久久久久蜜桃| 国产精品每日更新在线播放网址| hitomi一区二区三区精品| 日韩一区中文字幕| 色综合咪咪久久| 亚洲va韩国va欧美va| 精品日韩在线一区| 成人黄色电影在线| 亚洲最新视频在线观看| 欧美日韩一区二区三区免费看| 午夜伊人狠狠久久| 精品日韩一区二区三区 | 美日韩一级片在线观看| 亚洲精品在线电影| 99这里都是精品| 一区二区成人在线视频 | 久久影视一区二区| 成人黄色一级视频| 亚洲va欧美va人人爽|