📄 miniport.cpp
字号:
//********************************************************************
// 日期: 2004/08/10 - 10:8:2004 20:47
// 名前: tiamo
// 描述: miniport
//*********************************************************************
#include "stdafx.h"
// pAdapter
PADAPTER g_pAdapter;
// timer
PPPOE_TIMER g_timer;
// buffer pool
NDIS_HANDLE g_hBufferPool;
// miniport initialize
NDIS_STATUS miniportInitialize(PNDIS_STATUS openErrorStatus,PUINT pSelMediumIndex,PNDIS_MEDIUM mediumArray,
UINT mediumArraySize,NDIS_HANDLE miniportAdapterHandle,NDIS_HANDLE wrapperConfigurationContext)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
__try
{
// select medium type
UINT i;
for(i = 0; i < mediumArraySize; i++)
{
if(mediumArray[i] == NdisMediumWan)
{
*pSelMediumIndex = i;
drvDbgPrint("select wan medium type.\n");
break;
}
}
if(i == mediumArraySize)
{
drvDbgPrint("can't not select medium,raise status.\n");
ExRaiseStatus(status = NDIS_STATUS_UNSUPPORTED_MEDIA);
}
if(g_pAdapter)
{
drvDbgPrint("this can't happen...there should only be one miniport exported to ndiswan.\n");
status = NDIS_STATUS_FAILURE;
__leave;
}
g_pAdapter = CreateAdapter();
if(!g_pAdapter)
{
drvDbgPrint("can't allocate adapter memory.\n");
}
else
{
drvDbgPrint("allocate adapter object 0x%x.\n",g_pAdapter);
}
IntializeAdapter(g_pAdapter,miniportAdapterHandle,wrapperConfigurationContext);
// set attribute
NdisMSetAttributesEx(miniportAdapterHandle,g_pAdapter,0,
NDIS_ATTRIBUTE_IGNORE_PACKET_TIMEOUT |
NDIS_ATTRIBUTE_IGNORE_REQUEST_TIMEOUT |
NDIS_ATTRIBUTE_DESERIALIZE |
NDIS_ATTRIBUTE_NO_HALT_ON_SUSPEND,
NdisInterfaceInternal);
if(status != NDIS_STATUS_SUCCESS)
{
drvDbgPrint("can't not init pool,raise status 0x%x.\n",status);
ExRaiseStatus(status);
}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
if(g_pAdapter)
{
NdisFreeSpinLock(&g_pAdapter->m_lockSelf);
FreeAdapter(g_pAdapter);
g_pAdapter = NULL;
}
}
*openErrorStatus = status;
return status;
}
// miniport reset
NDIS_STATUS miniportReset(PBOOLEAN pbAddressingReset,NDIS_HANDLE pAdapter)
{
drvDbgPrint("miniport is not resetable.\n");
return NDIS_STATUS_NOT_RESETTABLE;
}
namespace
{
struct OidArray
{
NDIS_OID oid;
PCHAR string;
};
OidArray _s_supported[] =
{
OID_GEN_CURRENT_LOOKAHEAD,"OID_GEN_CURRENT_LOOKAHEAD",
OID_GEN_DRIVER_VERSION,"OID_GEN_DRIVER_VERSION",
OID_GEN_HARDWARE_STATUS,"OID_GEN_HARDWARE_STATUS",
OID_GEN_LINK_SPEED,"OID_GEN_LINK_SPEED",
OID_GEN_MAC_OPTIONS,"OID_GEN_MAC_OPTIONS",
OID_GEN_MAXIMUM_LOOKAHEAD,"OID_GEN_MAXIMUM_LOOKAHEAD",
OID_GEN_MAXIMUM_FRAME_SIZE,"OID_GEN_MAXIMUM_FRAME_SIZE",
OID_GEN_MAXIMUM_TOTAL_SIZE,"OID_GEN_MAXIMUM_TOTAL_SIZE",
OID_GEN_MEDIA_SUPPORTED,"OID_GEN_MEDIA_SUPPORTED",
OID_GEN_MEDIA_IN_USE,"OID_GEN_MEDIA_IN_USE",
OID_GEN_RCV_ERROR,"OID_GEN_RCV_ERROR",
OID_GEN_RCV_OK,"OID_GEN_RCV_OK",
OID_GEN_RECEIVE_BLOCK_SIZE,"OID_GEN_RECEIVE_BLOCK_SIZE",
OID_GEN_RECEIVE_BUFFER_SPACE,"OID_GEN_RECEIVE_BUFFER_SPACE",
OID_GEN_SUPPORTED_LIST,"OID_GEN_SUPPORTED_LIST",
OID_GEN_TRANSMIT_BLOCK_SIZE,"OID_GEN_TRANSMIT_BLOCK_SIZE",
OID_GEN_TRANSMIT_BUFFER_SPACE,"OID_GEN_TRANSMIT_BUFFER_SPACE",
OID_GEN_VENDOR_DESCRIPTION,"OID_GEN_VENDOR_DESCRIPTION",
OID_GEN_VENDOR_ID,"OID_GEN_VENDOR_ID",
OID_GEN_XMIT_ERROR,"OID_GEN_XMIT_ERROR",
OID_GEN_XMIT_OK,"OID_GEN_XMIT_OK",
OID_PNP_CAPABILITIES,"OID_PNP_CAPABILITIES",
OID_PNP_SET_POWER,"OID_PNP_SET_POWER",
OID_PNP_QUERY_POWER,"OID_PNP_QUERY_POWER",
OID_PNP_ENABLE_WAKE_UP,"OID_PNP_QUERY_POWER",
OID_TAPI_CLOSE,"OID_TAPI_CLOSE",
OID_TAPI_DROP,"OID_TAPI_DROP",
OID_TAPI_GET_ADDRESS_CAPS,"OID_TAPI_GET_ADDRESS_CAPS",
OID_TAPI_GET_ADDRESS_STATUS,"OID_TAPI_GET_ADDRESS_STATUS",
OID_TAPI_GET_CALL_INFO,"OID_TAPI_GET_CALL_INFO",
OID_TAPI_GET_CALL_STATUS,"OID_TAPI_GET_CALL_STATUS",
OID_TAPI_GET_DEV_CAPS,"OID_TAPI_GET_DEV_CAPS",
OID_TAPI_GET_EXTENSION_ID,"OID_TAPI_GET_EXTENSION_ID",
OID_TAPI_GET_ID,"OID_TAPI_GET_ID",
OID_TAPI_MAKE_CALL,"OID_TAPI_MAKE_CALL",
OID_TAPI_CLOSE_CALL,"OID_TAPI_CLOSE_CALL",
OID_TAPI_NEGOTIATE_EXT_VERSION,"OID_TAPI_NEGOTIATE_EXT_VERSION",
OID_TAPI_OPEN,"OID_TAPI_OPEN",
OID_TAPI_ANSWER,"OID_TAPI_ANSWER",
OID_TAPI_PROVIDER_INITIALIZE,"OID_TAPI_PROVIDER_INITIALIZE",
OID_TAPI_PROVIDER_SHUTDOWN,"OID_TAPI_PROVIDER_SHUTDOWN",
OID_TAPI_SET_STATUS_MESSAGES,"OID_TAPI_SET_STATUS_MESSAGES",
OID_TAPI_SET_DEFAULT_MEDIA_DETECTION,"OID_TAPI_SET_DEFAULT_MEDIA_DETECTION",
OID_WAN_CURRENT_ADDRESS,"OID_WAN_CURRENT_ADDRESS",
OID_WAN_GET_BRIDGE_INFO,"OID_WAN_GET_BRIDGE_INFO",
OID_WAN_GET_COMP_INFO,"OID_WAN_GET_COMP_INFO",
OID_WAN_GET_INFO,"OID_WAN_GET_INFO",
OID_WAN_GET_LINK_INFO,"OID_WAN_GET_LINK_INFO",
OID_WAN_GET_STATS_INFO,"OID_WAN_GET_STATS_INFO",
OID_WAN_HEADER_FORMAT,"OID_WAN_HEADER_FORMAT",
OID_WAN_LINE_COUNT,"OID_WAN_LINE_COUNT",
OID_WAN_MEDIUM_SUBTYPE,"OID_WAN_MEDIUM_SUBTYPE",
OID_WAN_PERMANENT_ADDRESS,"OID_WAN_PERMANENT_ADDRESS",
OID_WAN_PROTOCOL_TYPE,"OID_WAN_PROTOCOL_TYPE",
OID_WAN_QUALITY_OF_SERVICE,"OID_WAN_QUALITY_OF_SERVICE",
OID_WAN_SET_BRIDGE_INFO,"OID_WAN_SET_BRIDGE_INFO",
OID_WAN_SET_COMP_INFO,"OID_WAN_SET_COMP_INFO",
OID_WAN_SET_LINK_INFO,"OID_WAN_SET_LINK_INFO",
0,"unknown",
};
}
// miniport query
NDIS_STATUS miniportQueryInformation(PADAPTER pAdapter,NDIS_OID oid,PVOID pInformationBuffer,
ULONG ulBufferLength,PULONG pulBytesWritten,PULONG pulBytesNeeded)
{
static UCHAR _s_macAddress[6] = {0x33,0x50,0x6f,0x45,0x30,0x30};
ULONG i;
for(i = 0;i < sizeof(_s_supported) / sizeof(OidArray); i ++)
{
if(_s_supported[i].oid == oid)
{
drvDbgPrint("oid = %s\n",_s_supported[i].string);
break;
}
}
if(i == sizeof(_s_supported) / sizeof(OidArray))
{
drvDbgPrint("oid = unknown(0x%x)\n",oid);
}
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
ULONG ulNeeded = 0;
PVOID pBuffer = NULL;
ULONG ulTemp;
switch(oid)
{
// supported list
case OID_GEN_SUPPORTED_LIST:
{
ulNeeded = sizeof(_s_supported)/sizeof(OidArray) * sizeof(NDIS_OID);
if(ulBufferLength >= ulNeeded)
{
PNDIS_OID pBuffer = static_cast<PNDIS_OID>(pInformationBuffer);
for(i = 0;i < sizeof(_s_supported) / sizeof(OidArray); i ++)
{
*pBuffer++ = _s_supported[i].oid;
}
}
}
break;
// wan get info
case OID_WAN_GET_INFO:
{
ulNeeded = sizeof(NDIS_WAN_INFO);
if(ulBufferLength >= ulNeeded)
{
pBuffer = &g_pAdapter->m_wanInfo;
}
}
break;
// address
case OID_WAN_CURRENT_ADDRESS:
case OID_WAN_PERMANENT_ADDRESS:
{
ulNeeded = 6;
if(ulBufferLength >= ulNeeded)
{
pBuffer = _s_macAddress;
}
}
break;
// medium sub type
case OID_WAN_MEDIUM_SUBTYPE:
{
ulNeeded = sizeof(ULONG);
if(ulBufferLength >= ulNeeded)
{
// ulTemp = NdisWanMediumPppoe;
// isdn can accept incoming call
ulTemp = NdisWanMediumIsdn;
pBuffer = &ulTemp;
}
}
break;
// get link info
case OID_WAN_GET_LINK_INFO:
{
ulNeeded = sizeof(NDIS_WAN_GET_LINK_INFO);
if(ulBufferLength >= ulNeeded)
{
PCALL_INFO pCall = GetCallPtrFromCallHandle(pAdapter->m_pCallHandleTable,
(HDRV_CALL)static_cast<PNDIS_WAN_GET_LINK_INFO>(pInformationBuffer)->NdisLinkHandle);
pBuffer = &pCall->m_wanLinkInfo;
}
}
break;
// mac option
case OID_GEN_MAC_OPTIONS:
{
ulNeeded = sizeof(ULONG);
if(ulBufferLength >= ulNeeded)
{
ulTemp = NDIS_MAC_OPTION_TRANSFERS_NOT_PEND;
pBuffer = &ulTemp;
}
}
break;
// get id
case OID_TAPI_GET_ID:
{
ulNeeded = sizeof(NDIS_TAPI_GET_ID);
if(ulBufferLength >= ulNeeded)
{
PNDIS_TAPI_GET_ID pGetId = static_cast<PNDIS_TAPI_GET_ID>(pInformationBuffer);
pGetId->DeviceID.ulTotalSize = ulBufferLength - (sizeof(NDIS_TAPI_GET_ID) - sizeof(VAR_STRING));
status = TspiGetId(pAdapter,pGetId,ulBufferLength);
ulNeeded = pGetId->DeviceID.ulNeededSize + (sizeof(NDIS_TAPI_GET_ID) - sizeof(VAR_STRING));
}
}
break;
// extension id
case OID_TAPI_GET_EXTENSION_ID:
{
ulNeeded = sizeof(NDIS_TAPI_GET_EXTENSION_ID);
if(ulBufferLength >= ulNeeded)
{
PNDIS_TAPI_GET_EXTENSION_ID pInfo = static_cast<PNDIS_TAPI_GET_EXTENSION_ID>(pInformationBuffer);
status = TspiGetExtensionId(pAdapter,pInfo);
}
}
break;
// device caps
case OID_TAPI_GET_DEV_CAPS:
{
ulNeeded = sizeof(NDIS_TAPI_GET_DEV_CAPS);
if(ulBufferLength >= ulNeeded)
{
PNDIS_TAPI_GET_DEV_CAPS pCaps = static_cast<PNDIS_TAPI_GET_DEV_CAPS>(pInformationBuffer);
pCaps->LineDevCaps.ulTotalSize = ulBufferLength - (sizeof(NDIS_TAPI_GET_DEV_CAPS) - sizeof(LINE_DEV_CAPS));
status = TspiGetDeviceCaps(pAdapter,pCaps);
ulNeeded = pCaps->LineDevCaps.ulNeededSize + (sizeof(NDIS_TAPI_GET_DEV_CAPS) - sizeof(LINE_DEV_CAPS));
}
}
break;
// call status
case OID_TAPI_GET_CALL_STATUS:
{
ulNeeded = sizeof(NDIS_TAPI_GET_CALL_STATUS);
if(ulBufferLength >= ulNeeded)
{
PNDIS_TAPI_GET_CALL_STATUS pCallStatus = static_cast<PNDIS_TAPI_GET_CALL_STATUS>(pInformationBuffer);
pCallStatus->LineCallStatus.ulTotalSize = ulBufferLength -
(sizeof(NDIS_TAPI_GET_CALL_STATUS) - sizeof(LINE_CALL_STATUS));
status = TspiGetCallStatus(pAdapter,pCallStatus);
ulNeeded = pCallStatus->LineCallStatus.ulNeededSize +
(sizeof(NDIS_TAPI_GET_CALL_STATUS) - sizeof(LINE_CALL_STATUS));
}
}
break;
// call info
case OID_TAPI_GET_CALL_INFO:
{
ulNeeded = sizeof(NDIS_TAPI_GET_CALL_INFO);
if(ulBufferLength >= ulNeeded)
{
PNDIS_TAPI_GET_CALL_INFO pCallInfo = static_cast<PNDIS_TAPI_GET_CALL_INFO>(pInformationBuffer);
pCallInfo->LineCallInfo.ulTotalSize = ulBufferLength -
(sizeof(NDIS_TAPI_GET_CALL_INFO) - sizeof(LINE_CALL_INFO));
status = TspiGetCallInfo(pAdapter,pCallInfo);
ulNeeded = pCallInfo->LineCallInfo.ulNeededSize +
(sizeof(NDIS_TAPI_GET_CALL_INFO) - sizeof(LINE_CALL_INFO));
}
}
break;
// address status
case OID_TAPI_GET_ADDRESS_STATUS:
{
ulNeeded = sizeof(NDIS_TAPI_GET_ADDRESS_STATUS);
if(ulBufferLength >= ulNeeded)
{
PNDIS_TAPI_GET_ADDRESS_STATUS pAddrStatus = static_cast<PNDIS_TAPI_GET_ADDRESS_STATUS>(pInformationBuffer);
pAddrStatus->LineAddressStatus.ulTotalSize = ulBufferLength -
(sizeof(NDIS_TAPI_GET_ADDRESS_STATUS) - sizeof(LINE_ADDRESS_STATUS));
status = TspiGetAddressStatus(pAdapter,pAddrStatus);
ulNeeded = pAddrStatus->LineAddressStatus.ulNeededSize +
(sizeof(NDIS_TAPI_GET_ADDRESS_STATUS) - sizeof(LINE_ADDRESS_STATUS));
}
}
break;
// address caps
case OID_TAPI_GET_ADDRESS_CAPS:
{
ulNeeded = sizeof(NDIS_TAPI_GET_ADDRESS_CAPS);
if(ulBufferLength >= ulNeeded)
{
PNDIS_TAPI_GET_ADDRESS_CAPS pAddrCaps = static_cast<PNDIS_TAPI_GET_ADDRESS_CAPS>(pInformationBuffer);
pAddrCaps->LineAddressCaps.ulTotalSize = ulBufferLength -
(sizeof(NDIS_TAPI_GET_ADDRESS_CAPS) - sizeof(LINE_ADDRESS_CAPS));
status = TspiGetAddressCaps(pAdapter,pAddrCaps);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -