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

📄 adapter.cpp

📁 pppoe client
💻 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<PVOID *>(&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<PVOID*>(&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<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);
	ZwClose(hKey);

	if(status != NDIS_STATUS_SUCCESS || pInfo->Type != REG_SZ)
		return status;

	ANSI_STRING ansString;
	ansString.Buffer = reinterpret_cast<PCHAR>(pAdapter->m_ucAC);
	ansString.Length = sizeof(pAdapter->m_ucAC);
	ansString.MaximumLength = sizeof(pAdapter->m_ucAC);

	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_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));
}

⌨️ 快捷键说明

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