⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adapter.cpp

📁 pppoe client
💻 CPP
字号:

//********************************************************************
//	日期:	2004/08/14 - 14:8:2004   8:51
//	名前:	tiamo
//	描述:	Adapter
//*********************************************************************

#include "stdafx.h"

// create adapter
PADAPTER CreateAdapter()
{
	PADAPTER pAdapter = NULL;

	// allocate adapter memory
	NdisAllocateMemoryWithTag(reinterpret_cast<PVOID*>(&pAdapter),sizeof(ADAPTER),'PoAp');

	return pAdapter;
}

// free adapter
VOID FreeAdapter(PADAPTER pAdapter)
{
	NdisFreeMemory(pAdapter,sizeof(ADAPTER),0);
}

// initialize adapter
VOID IntializeAdapter(PADAPTER pAdapter,NDIS_HANDLE hMiniport,NDIS_HANDLE hConfigContext)
{
	NdisZeroMemory(pAdapter,sizeof(ADAPTER));
	pAdapter->m_ulSig = 'ADAP';
	pAdapter->m_lRefCount = 1;
	NdisAllocateSpinLock(&pAdapter->m_lockSelf);
	NdisInitializeEvent(&pAdapter->m_evRemove);

	pAdapter->m_hMiniportAdapter = hMiniport;

	// read registry settings
	ReadRegestrySettings(pAdapter,hConfigContext);

	pAdapter->m_wanInfo.FramingBits = PPP_FRAMING | TAPI_PROVIDER;
	pAdapter->m_wanInfo.HeaderPadding = PPPOE_HEADER_LEN;
	pAdapter->m_wanInfo.HighestAcceptableAddress.HighPart = -1;
	pAdapter->m_wanInfo.HighestAcceptableAddress.LowPart = -1;
	pAdapter->m_wanInfo.MaxFrameSize = PPPOE_WAN_MAX_FRAME_SIZE;
	pAdapter->m_wanInfo.MaxTransmit = 1;

	pAdapter->m_ulAdapterFlags = ADAPTER_INITIALIZED;
}

// reference adapter
VOID ReferenceAdapter(PADAPTER pAdapter,BOOLEAN bAcquireSpinLock)
{
	if(bAcquireSpinLock)
		NdisAcquireSpinLock(&pAdapter->m_lockSelf);

	pAdapter->m_lRefCount ++;

	if(bAcquireSpinLock)
		NdisReleaseSpinLock(&pAdapter->m_lockSelf);
}

// dereference adapter
VOID DereferenceAdapter(PADAPTER pAdapter)
{
	NdisAcquireSpinLock(&pAdapter->m_lockSelf);

	LONG lCount = --pAdapter->m_lRefCount;

	NdisReleaseSpinLock(&pAdapter->m_lockSelf);

	if(!lCount)
		NdisSetEvent(&pAdapter->m_evRemove);
}

// read registry settings
VOID ReadRegestrySettings(PADAPTER pAdapter,NDIS_HANDLE hWrapperContext)
{
	static CHAR _s_AcName[] = "_tiamo_implement";

	NDIS_HANDLE hConfig = NULL;
	NDIS_STATUS status;

	pAdapter->m_ulEndPoints = 2;
	pAdapter->m_ulMaxCallsPerClient = 1;
	pAdapter->m_ulNumLineDevs = 1;
	pAdapter->m_ulRecvTimeOut = 5000;
	pAdapter->m_ulSendTimeOut = 5000;
	pAdapter->m_ulMaxRetryTimes = 3;

	NdisMoveMemory(pAdapter->m_ucACName,_s_AcName,sizeof(_s_AcName) - sizeof(UCHAR));
	pAdapter->m_usACNameLen = sizeof(_s_AcName) - sizeof(UCHAR);

	UNICODE_STRING strKey;
	NdisInitUnicodeString(&strKey,L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\ComputerName\\ComputerName");

	OBJECT_ATTRIBUTES oa;
	InitializeObjectAttributes(&oa,&strKey,OBJ_CASE_INSENSITIVE,NULL,NULL);

	// get computer name as ac name
	HANDLE hKey;
	status = ZwOpenKey(&hKey,KEY_QUERY_VALUE,&oa);
	if(status == NDIS_STATUS_SUCCESS)
	{
		static UCHAR _s_Buffer[sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 255 - sizeof(_s_AcName)];

		PKEY_VALUE_PARTIAL_INFORMATION pInfo = reinterpret_cast<PKEY_VALUE_PARTIAL_INFORMATION>(_s_Buffer);
		ULONG ulLen;

		UNICODE_STRING strValue;
		NdisInitUnicodeString(&strValue,L"ComputerName");

		status = ZwQueryValueKey(hKey,&strValue,KeyValuePartialInformation,pInfo,sizeof(_s_Buffer),&ulLen);
		if(status == NDIS_STATUS_SUCCESS && pInfo->Type == REG_SZ)
		{
			ANSI_STRING ansString;
			ansString.Buffer = reinterpret_cast<PCHAR>(pAdapter->m_ucACName);
			ansString.Length = sizeof(pAdapter->m_ucACName);
			ansString.MaximumLength = sizeof(pAdapter->m_ucACName);

			UNICODE_STRING uniString;
			uniString.Length = static_cast<USHORT>(pInfo->DataLength - sizeof(WCHAR));
			uniString.MaximumLength = static_cast<USHORT>(pInfo->DataLength);
			uniString.Buffer = reinterpret_cast<PWCHAR>(pInfo->Data);

			NdisUnicodeStringToAnsiString(&ansString,&uniString);

			NdisMoveMemory(pAdapter->m_ucACName + ansString.Length,_s_AcName,sizeof(_s_AcName) - sizeof(UCHAR));
			pAdapter->m_usACNameLen = ansString.Length + sizeof(_s_AcName) - sizeof(UCHAR);
		}

		ZwClose(hKey);
	}

	NdisOpenConfiguration(&status,&hConfig,hWrapperContext);

	if(status == NDIS_STATUS_SUCCESS)
	{
		PNDIS_CONFIGURATION_PARAMETER pParameter;
		NDIS_STRING strKeyword;

		// end points should be 2 one for outgoing one for incoming
		NdisInitUnicodeString(&strKeyword,L"WanEndPoints");

		NdisReadConfiguration(&status,&pParameter,hConfig,&strKeyword,NdisParameterInteger);

		if(status == NDIS_STATUS_SUCCESS)
			pAdapter->m_ulEndPoints = pParameter->ParameterData.IntegerData;

		// max retry count default to 3
		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;

		// xxx
		pAdapter->m_ulEndPoints *= 2;

		if(pAdapter->m_ulEndPoints < 2)
			pAdapter->m_ulEndPoints = 2;

		pAdapter->m_ulMaxCallsPerClient = pAdapter->m_ulEndPoints / 2;

		if(pAdapter->m_ulMaxCallsPerClient > 3)
			pAdapter->m_ulMaxCallsPerClient = 3;

		NdisCloseConfiguration(hConfig);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -