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

📄 miniport.cpp

📁 pppoe client
💻 CPP
📖 第 1 页 / 共 2 页
字号:

//********************************************************************
//	日期:	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 + -