📄 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<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 + -