miniport.cpp
来自「pppoe client」· C++ 代码 · 共 663 行 · 第 1/2 页
CPP
663 行
uNeeded = sizeof(ulValue);
break;
case OID_GEN_CO_VENDOR_DRIVER_VERSION:
ulValue = 1 << 8;
pTempBuffer = &ulValue;
uNeeded = sizeof(ulValue);
break;
case OID_CO_TAPI_CM_CAPS:
{
PCO_TAPI_CM_CAPS pCallManagerCaps = static_cast<PCO_TAPI_CM_CAPS>(pBuffer);
uNeeded = sizeof(CO_TAPI_CM_CAPS);
if(uNeeded <= uBufferLen)
{
pCallManagerCaps->ulCoTapiVersion = CO_TAPI_VERSION;
pCallManagerCaps->ulFlags = 0;
pCallManagerCaps->ulNumLines = g_pAdapter->m_ulNumChannels;
}
DebugInfo(("get call manager caps len = %d,version = 0x%x,lines = 0x%x\n",uBufferLen,CO_TAPI_VERSION,
g_pAdapter->m_ulNumChannels));
}
break;
case OID_CO_TAPI_LINE_CAPS:
{
PCO_TAPI_LINE_CAPS pLineCaps = static_cast<PCO_TAPI_LINE_CAPS>(pBuffer);
uNeeded = sizeof(CO_TAPI_LINE_CAPS);
if(uNeeded <= uBufferLen && pLineCaps->ulLineID < g_pAdapter->m_ulNumChannels)
{
*puWritten = uNeeded;
NdisZeroMemory(pLineCaps, uNeeded);
pLineCaps->LineDevCaps.ulTotalSize = uBufferLen - sizeof(CO_TAPI_LINE_CAPS) + sizeof(LINE_DEV_CAPS);;
pLineCaps->ulFlags = 0;
PCHANNEL pChannel = g_pAdapter->m_ppChannels[pLineCaps->ulLineID];
pLineCaps->LineDevCaps.ulNeededSize = pLineCaps->LineDevCaps.ulUsedSize = sizeof(LINE_DEV_CAPS);
pLineCaps->LineDevCaps.ulPermanentLineID = pChannel->m_ulLineId; // id
pLineCaps->LineDevCaps.ulStringFormat = STRINGFORMAT_UNICODE; // unicode string
pLineCaps->LineDevCaps.ulAddressModes = LINEADDRESSMODE_ADDRESSID; // address id
pLineCaps->LineDevCaps.ulNumAddresses = 1; // only one address per channel
pLineCaps->LineDevCaps.ulBearerModes = pChannel->m_ulBearerMode; // bearer mode
pLineCaps->LineDevCaps.ulMaxRate = pChannel->m_ulLinkSpeed; // link speed
pLineCaps->LineDevCaps.ulMediaModes = pChannel->m_ulMediaMode; // media mode
pLineCaps->LineDevCaps.ulDevCapFlags = LINEDEVCAPFLAGS_CLOSEDROP; // dev cap
pLineCaps->LineDevCaps.ulMaxNumActiveCalls = 1; // only one call
pLineCaps->LineDevCaps.ulAnswerMode = LINEANSWERMODE_DROP; // drop this when answer another
pLineCaps->LineDevCaps.ulRingModes = 1; // one ring
pLineCaps->LineDevCaps.ulLineStates = LINEDEVSTATE_RINGING | LINEDEVSTATE_CONNECTED | LINEDEVSTATE_DISCONNECTED |
LINEDEVSTATE_OPEN | LINEDEVSTATE_CLOSE;
pLineCaps->LineDevCaps.ulLineFeatures = LINEFEATURE_MAKECALL; // can make call
UINT uInfoOffset = sizeof(pLineCaps->LineDevCaps);
UINT uInfoLength = sizeof(_s_vendor_desc);
pLineCaps->LineDevCaps.ulNeededSize += uInfoLength;
uNeeded += uInfoOffset;
if(pLineCaps->LineDevCaps.ulNeededSize <= pLineCaps->LineDevCaps.ulTotalSize)
{
pLineCaps->LineDevCaps.ulProviderInfoSize = uInfoLength; // provider info
pLineCaps->LineDevCaps.ulProviderInfoOffset = uInfoOffset;
NdisMoveMemory(reinterpret_cast<PUCHAR>(&pLineCaps->LineDevCaps) + uInfoOffset, _s_vendor_desc,uInfoLength);
pLineCaps->LineDevCaps.ulUsedSize += uInfoLength;
uInfoOffset += uInfoLength;
}
}
DebugInfo(("get line caps,len = %d,line id = %d,bearer mode = 0x%x,media mode = 0x%x,speed = %d\n",
uBufferLen,pLineCaps->ulLineID,pLineCaps->LineDevCaps.ulBearerModes,pLineCaps->LineDevCaps.ulMediaModes,
pLineCaps->LineDevCaps.ulMaxRate));
}
break;
case OID_CO_TAPI_ADDRESS_CAPS:
{
PCO_TAPI_ADDRESS_CAPS pAddressCaps = static_cast<PCO_TAPI_ADDRESS_CAPS>(pBuffer);
uNeeded = sizeof(CO_TAPI_ADDRESS_CAPS);
if(uNeeded <= uBufferLen && pAddressCaps->ulLineID < g_pAdapter->m_ulNumChannels)
{
NdisZeroMemory(pAddressCaps,uNeeded);
pAddressCaps->LineAddressCaps.ulTotalSize = uBufferLen - sizeof(CO_TAPI_ADDRESS_CAPS) + sizeof(LINE_ADDRESS_CAPS);
pAddressCaps->ulFlags = 0;
PCHANNEL pChannel = g_pAdapter->m_ppChannels[pAddressCaps->ulLineID];
*puWritten = uNeeded;
pAddressCaps->LineAddressCaps.ulNeededSize = pAddressCaps->LineAddressCaps.ulUsedSize = sizeof(LINE_ADDRESS_CAPS);
pAddressCaps->LineAddressCaps.ulLineDeviceID = pChannel->m_ulLineId;
pAddressCaps->LineAddressCaps.ulAddressSharing = LINEADDRESSSHARING_PRIVATE;
pAddressCaps->LineAddressCaps.ulAddressStates = 0;
pAddressCaps->LineAddressCaps.ulCallStates = LINECALLSTATE_IDLE | LINECALLSTATE_DIALING | LINECALLSTATE_OFFERING |
LINECALLSTATE_CONNECTED | LINECALLSTATE_DISCONNECTED;
pAddressCaps->LineAddressCaps.ulDialToneModes = LINEDIALTONEMODE_NORMAL;
pAddressCaps->LineAddressCaps.ulDisconnectModes = LINEDISCONNECTMODE_NORMAL | LINEDISCONNECTMODE_UNKNOWN |
LINEDISCONNECTMODE_BUSY | LINEDISCONNECTMODE_NOANSWER;
pAddressCaps->LineAddressCaps.ulMaxNumActiveCalls = 1;
pAddressCaps->LineAddressCaps.ulAddrCapFlags = LINEADDRCAPFLAGS_DIALED;
pAddressCaps->LineAddressCaps.ulCallFeatures = LINECALLFEATURE_ACCEPT | LINECALLFEATURE_ANSWER |
LINECALLFEATURE_DROP;
pAddressCaps->LineAddressCaps.ulAddressFeatures = LINEADDRFEATURE_MAKECALL;
UINT InfoOffset = sizeof(pAddressCaps->LineAddressCaps);
UINT InfoLength = sizeof(_s_address_name);
pAddressCaps->LineAddressCaps.ulNeededSize += InfoLength;
uNeeded += InfoLength;
if(pAddressCaps->LineAddressCaps.ulNeededSize <= pAddressCaps->LineAddressCaps.ulTotalSize)
{
pAddressCaps->LineAddressCaps.ulAddressSize = InfoLength;
pAddressCaps->LineAddressCaps.ulAddressOffset = InfoOffset;
PWCHAR pBuffer = reinterpret_cast<PWCHAR>(&pAddressCaps->LineAddressCaps) + InfoOffset / 2;
NdisMoveMemory(pBuffer,_s_address_name,InfoLength);
pBuffer[(InfoLength - 4) / 2] = static_cast<WCHAR>(pAddressCaps->ulAddressID) + L'0';
pAddressCaps->LineAddressCaps.ulUsedSize += InfoLength;
InfoOffset += InfoLength;
DebugInfo(("get addr caps,len = %d,line id = %d,addr id = %d,name = %ls\n",
uBufferLen,pAddressCaps->ulLineID,pAddressCaps->ulAddressID,pBuffer));
}
}
}
break;
case OID_802_3_PERMANENT_ADDRESS:
case OID_802_3_CURRENT_ADDRESS:
case OID_WAN_PERMANENT_ADDRESS:
case OID_WAN_CURRENT_ADDRESS:
pTempBuffer = _s_address;
uNeeded = sizeof(_s_address);
DebugInfo(("get eth address 0x%02x-0x%02x-0x%02x-0x%02x-0x%02x-0x%02x\n",
_s_address[0],_s_address[1],_s_address[2],_s_address[3],_s_address[4],_s_address[5]));
break;
case OID_WAN_MEDIUM_SUBTYPE:
//ulValue = NdisWanMediumIsdn;
ulValue = NdisWanMediumPppoe;
pTempBuffer = &ulValue;
uNeeded = sizeof(ulValue);
break;
case OID_WAN_CO_GET_INFO:
{
PNDIS_WAN_CO_INFO pInfo = &g_pAdapter->m_wanCoInfo;
pTempBuffer = pInfo;
uNeeded = sizeof(g_pAdapter->m_wanCoInfo);
DebugInfo(("wan co get info len = %d,DesiredACCM = %d,FramingBits = %d,MaxFrameSize = %d,MaxSendWindow = %d\n",
uBufferLen,pInfo->DesiredACCM,pInfo->FramingBits,pInfo->MaxFrameSize,pInfo->MaxSendWindow));
}
break;
case OID_WAN_CO_GET_LINK_INFO:
if(!pChannel)
{
uNeeded = 0;
status = NDIS_STATUS_INVALID_DATA;
}
else
{
PNDIS_WAN_CO_GET_LINK_INFO pInfo = &pChannel->m_wanCoLinkInfo;
pTempBuffer = pInfo;
uNeeded = sizeof(NDIS_WAN_CO_GET_LINK_INFO);
DebugInfo(( "get link info size = %d,MaxRecvFrame = %d,MaxSendFrame = %d,RecvACCM = %d,RecvCompressionBits = %d,"
"RecvFramingBits = %d,SendACCM= %d,SendCompressionBits = %d,SendFramingBits = %d,pChannel = 0x%x\n",
uBufferLen,pInfo->MaxRecvFrameSize,pInfo->MaxSendFrameSize,
pInfo->RecvACCM,pInfo->RecvCompressionBits,pInfo->RecvFramingBits,pInfo->SendACCM,
pInfo->SendCompressionBits,pInfo->SendFramingBits,pChannel));
}
break;
case OID_WAN_LINE_COUNT:
ulValue = g_pAdapter->m_ulNumChannels;
pTempBuffer = &ulValue;
uNeeded = sizeof(ulValue);
break;
case OID_PNP_CAPABILITIES:
PnpCapabilities.WakeUpCapabilities.MinMagicPacketWakeUp = NdisDeviceStateUnspecified;
PnpCapabilities.WakeUpCapabilities.MinPatternWakeUp = NdisDeviceStateUnspecified;
PnpCapabilities.WakeUpCapabilities.MinLinkChangeWakeUp = NdisDeviceStateUnspecified;
pTempBuffer = &PnpCapabilities;
uNeeded = sizeof(PnpCapabilities);
break;
case OID_PNP_QUERY_POWER:
break;
default:
status = NDIS_STATUS_INVALID_OID;
break;
}
if(uNeeded > uBufferLen)
{
*puNeeded = uNeeded;
*puWritten = 0;
status = NDIS_STATUS_INVALID_LENGTH;
}
else
{
if(pTempBuffer)
{
NdisMoveMemory(pBuffer,pTempBuffer,uNeeded);
}
*puNeeded = *puWritten = uNeeded;
}
return status;
}
// set quest DISPATCH_LEVEL
NDIS_STATUS SetRequest(PCHANNEL pChannel,NDIS_OID oid,PVOID pBuffer,UINT uBufferLen,PUINT puRead,PUINT puNeeded)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
*puRead = *puNeeded = 0;
switch(oid)
{
case OID_GEN_CURRENT_LOOKAHEAD:
DebugInfo(("set current lookahead.do nothing,total packet is lookahead buffer.\n"));
*puRead = *puNeeded = sizeof(ULONG);
break;
case OID_WAN_CO_SET_LINK_INFO:
{
PNDIS_WAN_CO_SET_LINK_INFO pInfo = static_cast<PNDIS_WAN_CO_SET_LINK_INFO>(pBuffer);
DebugInfo(( "set link info size = %d,MaxRecvFrame = %d,MaxSendFrame = %d,RecvACCM = %d,RecvCompressionBits = %d,"
"RecvFramingBits = %d,SendACCM= %d,SendCompressionBits = %d,SendFramingBits = %d,pChannel = 0x%x\n",
uBufferLen,pInfo->MaxRecvFrameSize,pInfo->MaxSendFrameSize,
pInfo->RecvACCM,pInfo->RecvCompressionBits,pInfo->RecvFramingBits,pInfo->SendACCM,
pInfo->SendCompressionBits,pInfo->SendFramingBits,pChannel));
if(uBufferLen >= sizeof(NDIS_WAN_CO_SET_LINK_INFO))
{
if(pChannel)
{
NdisMoveMemory(&pChannel->m_wanCoLinkInfo,pBuffer,sizeof(NDIS_WAN_CO_SET_LINK_INFO));
*puRead = sizeof(NDIS_WAN_CO_SET_LINK_INFO);
}
}
}
*puNeeded = sizeof(NDIS_WAN_CO_SET_LINK_INFO);
break;
case OID_PNP_SET_POWER:
case OID_GEN_CO_PROTOCOL_OPTIONS:
break;
default:
status = NDIS_STATUS_INVALID_OID;
break;
}
return status;
}
// send packet
NDIS_STATUS SendPacket(PBIND_CONTEXT pBind,PPACKET pPacket)
{
NDIS_STATUS status;
pPacket->m_pBindContext = pBind;
NdisSend(&status,pBind->m_pOpenBlock,pPacket->m_pNdisPacket);
if(status != NDIS_STATUS_PENDING)
{
protocolSendComplete(pBind,pPacket->m_pNdisPacket,status);
}
return status;
}
// broadcast packet
BOOLEAN BroadcastPacket(PPACKET pPacket)
{
BOOLEAN bRet = FALSE;
NdisAcquireSpinLock(&g_lockBind);
PLIST_ENTRY pEntry = g_ltBindsHead.Flink;
for(; pEntry != &g_ltBindsHead; pEntry = pEntry->Flink)
{
bRet = TRUE;
PBIND_CONTEXT pBind = CONTAINING_RECORD(pEntry,BIND_CONTEXT,m_ltBindAnchor);
PPACKET pPacketClone = ClonePacket(pPacket);
if(pPacketClone)
{
NdisMoveMemory(pPacketClone->m_pFrame->m_srcMac,pBind->m_macAddress,ETH_ADDR_LEN);
ReferenceBind(pBind,TRUE);
ReferencePacket(pPacketClone);
SendPacket(pBind,pPacketClone);
DereferencePacket(pPacketClone);
}
}
NdisReleaseSpinLock(&g_lockBind);
return bRet;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?