www.pudn.com > PPPOE.rar > adapter.cpp


 
//******************************************************************** 
//	ÈÕÆÚ:	2004/08/25 - 25:8:2004   3:24 
//	Ãûǰ:	tiamo 
//	ÃèÊö:	adapter 
//********************************************************************* 
 
#include "stdafx.h" 
 
#define __ulFILE__											MAKE_SIG('A','D','A','P') 
 
PADAPTER g_pAdapter; 
 
#pragma alloc_text(PAGE,InitializeAdapter) 
#pragma alloc_text(PAGE,ShutdownAdapter) 
 
// create adapter 
PADAPTER CreateAdapter() 
{ 
	PADAPTER pRet = NULL; 
	AllocateMemory(reinterpret_cast(&pRet),sizeof(ADAPTER),ADAPTER_SIG); 
 
	NdisZeroMemory(pRet,sizeof(ADAPTER)); 
 
	pRet->m_ulSig = ADAPTER_SIG; 
 
	return pRet; 
} 
 
// init adapter 
NDIS_STATUS InitializeAdapter(PADAPTER pAdapter,NDIS_HANDLE hNdisAdapter,NDIS_HANDLE hConfigContext) 
{ 
	PAGED_CODE(); 
 
	ASSERT(pAdapter && pAdapter->m_ulSig == ADAPTER_SIG); 
 
	NDIS_STATUS status = NDIS_STATUS_SUCCESS; 
 
	pAdapter->m_lRefCount = 1; 
	pAdapter->m_hNdisAdapter = hNdisAdapter; 
	pAdapter->m_wanCoInfo.DesiredACCM = 0; 
	pAdapter->m_wanCoInfo.FramingBits = PPP_FRAMING; 
	pAdapter->m_wanCoInfo.MaxFrameSize = PPPOE_WAN_MAX_FRAME_SIZE; 
	pAdapter->m_wanCoInfo.MaxSendWindow = PPPOE_WAN_MAX_FRAME_SIZE; 
	pAdapter->m_ulNumChannels = 1; 
	pAdapter->m_ulSendTimeOut = 5000; 
	pAdapter->m_ulSendTimeOut = 5000; 
	pAdapter->m_ulMaxRetryTimes = 3; 
 
	NdisAllocateSpinLock(&pAdapter->m_lockSelf); 
	NdisInitializeEvent(&pAdapter->m_evRemove); 
 
	// get param 
	NDIS_HANDLE hConfig; 
	NdisOpenConfiguration(&status,&hConfig,hConfigContext); 
 
	if(status == NDIS_STATUS_SUCCESS) 
	{ 
		PNDIS_CONFIGURATION_PARAMETER pParameter; 
		NDIS_STRING strKeyword; 
 
		NdisInitUnicodeString(&strKeyword,L"NumChannels"); 
 
		NdisReadConfiguration(&status,&pParameter,hConfig,&strKeyword,NdisParameterInteger); 
 
		if(status == NDIS_STATUS_SUCCESS) 
			pAdapter->m_ulNumChannels = pParameter->ParameterData.IntegerData; 
 
		NdisInitUnicodeString(&strKeyword,L"MaxRetryCount"); 
		NdisReadConfiguration(&status,&pParameter,hConfig,&strKeyword,NdisParameterInteger); 
		if(status == NDIS_STATUS_SUCCESS) 
			pAdapter->m_ulMaxRetryTimes = pParameter->ParameterData.IntegerData; 
 
		// send recv time out 
		NdisInitUnicodeString(&strKeyword,L"SendTimeout"); 
		NdisReadConfiguration(&status,&pParameter,hConfig,&strKeyword,NdisParameterInteger); 
		if(status == NDIS_STATUS_SUCCESS) 
			pAdapter->m_ulSendTimeOut = pParameter->ParameterData.IntegerData; 
 
		NdisInitUnicodeString(&strKeyword,L"RecvTimeout"); 
		NdisReadConfiguration(&status,&pParameter,hConfig,&strKeyword,NdisParameterInteger); 
		if(status == NDIS_STATUS_SUCCESS) 
			pAdapter->m_ulRecvTimeOut = pParameter->ParameterData.IntegerData; 
 
		NdisCloseConfiguration(hConfig); 
	} 
 
	// create channels 
	status = AllocateMemory(reinterpret_cast(&pAdapter->m_ppChannels), 
							sizeof(PVOID)* pAdapter->m_ulNumChannels,CHANNEL_PTR_SIG); 
 
	// create and init each channel 
	for(ULONG i = 0; i < pAdapter->m_ulNumChannels; i ++) 
	{ 
		pAdapter->m_ppChannels[i] = CreateInitializeChannel(i); 
	} 
 
	// build ac name 
	static CHAR _s_AcName[] = "_tiamo_implement"; 
 
	NdisMoveMemory(pAdapter->m_ucAC,_s_AcName,sizeof(_s_AcName)); 
	pAdapter->m_usACLen = sizeof(_s_AcName); 
 
	OBJECT_ATTRIBUTES oa; 
 
	UNICODE_STRING strKey; 
	NdisInitUnicodeString(&strKey,L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\ComputerName\\ComputerName"); 
 
	InitializeObjectAttributes(&oa,&strKey,OBJ_CASE_INSENSITIVE,NULL,NULL); 
 
	HANDLE hKey; 
	status = ZwOpenKey(&hKey,KEY_QUERY_VALUE,&oa); 
 
	if(status != NDIS_STATUS_SUCCESS) 
		return status; 
 
	static UCHAR _s_Buffer[sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 255 - sizeof(_s_AcName)]; 
 
	PKEY_VALUE_PARTIAL_INFORMATION pInfo = reinterpret_cast(_s_Buffer); 
	ULONG ulLen; 
 
	UNICODE_STRING strValue; 
	NdisInitUnicodeString(&strValue,L"ComputerName"); 
 
	status = ZwQueryValueKey(hKey,&strValue,KeyValuePartialInformation,pInfo,sizeof(_s_Buffer),&ulLen); 
	ZwClose(hKey); 
 
	if(status != NDIS_STATUS_SUCCESS || pInfo->Type != REG_SZ) 
		return status; 
 
	ANSI_STRING ansString; 
	ansString.Buffer = reinterpret_cast(pAdapter->m_ucAC); 
	ansString.Length = sizeof(pAdapter->m_ucAC); 
	ansString.MaximumLength = sizeof(pAdapter->m_ucAC); 
 
	UNICODE_STRING uniString; 
	uniString.Length = static_cast(pInfo->DataLength - sizeof(WCHAR)); 
	uniString.MaximumLength = static_cast(pInfo->DataLength); 
	uniString.Buffer = reinterpret_cast(pInfo->Data); 
 
	NdisUnicodeStringToAnsiString(&ansString,&uniString); 
 
	NdisMoveMemory(pAdapter->m_ucAC + ansString.Length,_s_AcName,sizeof(_s_AcName) - sizeof(UCHAR)); 
	pAdapter->m_usACLen = ansString.Length + sizeof(_s_AcName) - sizeof(UCHAR); 
 
	return NDIS_STATUS_SUCCESS; 
} 
 
// reference adapter 
VOID ReferenceAdapter(PADAPTER pAdapter,BOOLEAN bAcquireLock) 
{ 
	ASSERT(pAdapter && pAdapter->m_ulSig == ADAPTER_SIG && pAdapter->m_lRefCount > 0); 
 
	if(bAcquireLock) 
		NdisAcquireSpinLock(&pAdapter->m_lockSelf); 
 
	pAdapter->m_lRefCount ++; 
 
	if(bAcquireLock) 
		NdisReleaseSpinLock(&pAdapter->m_lockSelf); 
} 
 
// derefence adapter 
VOID DereferenceAdapter(PADAPTER pAdapter) 
{ 
	ASSERT(pAdapter && pAdapter->m_ulSig == ADAPTER_SIG && pAdapter->m_lRefCount > 0); 
 
	NdisAcquireSpinLock(&pAdapter->m_lockSelf); 
 
	LONG lCount = --pAdapter->m_lRefCount; 
 
	NdisReleaseSpinLock(&pAdapter->m_lockSelf); 
 
	// set remove event 
	if(!lCount) 
		NdisSetEvent(&pAdapter->m_evRemove); 
} 
 
// shut down adapter 
VOID ShutdownAdapter(PADAPTER pAdapter) 
{ 
	PAGED_CODE(); 
 
	if(!pAdapter) 
		return; 
 
	ASSERT(pAdapter->m_ulSig == ADAPTER_SIG && pAdapter->m_lRefCount > 0); 
 
	DereferenceAdapter(pAdapter); 
 
	DebugInfo(("shutdown adapter = 0x%x,ref = %d.wait for remove event.\n",pAdapter,pAdapter->m_lRefCount)); 
 
	// wait for remove event 
	NdisWaitEvent(&pAdapter->m_evRemove,0); 
 
	// destroy all channels 
	for(ULONG i = 0; i < pAdapter->m_ulNumChannels; i ++) 
	{ 
		ShutdownChannel(pAdapter->m_ppChannels[i]); 
	} 
 
	// free memory 
	FreeMemory(pAdapter->m_ppChannels,sizeof(PVOID) * pAdapter->m_ulNumChannels); 
 
	FreeMemory(pAdapter,sizeof(ADAPTER)); 
}