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