asyncmac.c

来自「wince下的源代码集合打包」· C语言 代码 · 共 1,603 行 · 第 1/4 页

C
1,603
字号
		InitializeCriticalSection(&v_AdapterCS);        DEBUGMSG(ZONE_INIT, (TEXT("ASYNCMAC: DLL_PROCESS_ATTACH\n")));        break;    case DLL_PROCESS_DETACH:        DEBUGMSG(ZONE_INIT, (TEXT("ASYNCMAC: DLL_PROCESS_DETACH\n")));		DeleteCriticalSection(&v_AdapterCS);        break;    }    return TRUE;}VOID	MpHalt(	IN NDIS_HANDLE	MiniportAdapterContext	){	DEBUGMSG (ZONE_INIT|ZONE_INTERFACE, (TEXT("+ASYNCMAC:MpHalt(0x%X)\n"), MiniportAdapterContext));	EnterCriticalSection(&v_AdapterCS);    AsyncMacFreeMemory(MiniportAdapterContext, sizeof(ASYNCMAC_ADAPTER));	v_pAdapter = NULL;	v_GlobalAdapterCount--;	LeaveCriticalSection(&v_AdapterCS);	DEBUGMSG (ZONE_INIT|ZONE_INTERFACE, (TEXT("-ASYNCMAC:MpHalt\n")));}NDIS_STATUSMpInit(	OUT PNDIS_STATUS	OpenErrorStatus,	OUT PUINT			SelectedMediumIndex,	IN	PNDIS_MEDIUM	MediumArray,	IN	UINT			MediumArraySize,	IN	NDIS_HANDLE		MiniportAdapterHandle,	IN	NDIS_HANDLE		WrapperConfigurationContext	){	NDIS_STATUS						Status;    UINT							i;		// counter	PASYNCMAC_ADAPTER				pAdapter;    NDIS_HANDLE						ConfigHandle;    PNDIS_CONFIGURATION_PARAMETER	ReturnedValue;    NDIS_STRING						MaxFrameSizeStr = NDIS_STRING_CONST("MaxFrameSize");    NDIS_STRING						MaxSendFrameSizeStr = NDIS_STRING_CONST("MaxSendFrameSize");    NDIS_STRING						MaxRecvFrameSizeStr = NDIS_STRING_CONST("MaxRecvFrameSize");    NDIS_STRING						RecvBufSizeStr = NDIS_STRING_CONST("ReceiveBufferSize");    NDIS_STRING						RecvThreadPrioStr = NDIS_STRING_CONST("ReceiveThreadPriority256");	DEBUGMSG (ZONE_INIT|ZONE_INTERFACE,			  (TEXT("+ASYNCMAC:MpInit(0x%X, 0x%X, 0x%X, %d, 0x%X, 0x%X)\r\n"),			   OpenErrorStatus, SelectedMediumIndex, MediumArray,			   MediumArraySize, MiniportAdapterHandle,			   WrapperConfigurationContext));		//	// We only support a single instance of AsyncMac	//	if (v_GlobalAdapterCount != 0) {		return NDIS_STATUS_FAILURE;	}	for (i = 0; TRUE; i++)	{		if (i >= MediumArraySize)			return NDIS_STATUS_UNSUPPORTED_MEDIA;		if (MediumArray[i] == NdisMediumWan)		{			*SelectedMediumIndex = i;			break;		}	}	//	// Let's allocate an AsyncMac adapter structure.    //	pAdapter = AsyncMacAllocateMemory(sizeof(ASYNCMAC_ADAPTER));    if (pAdapter == NULL)	{        return NDIS_STATUS_RESOURCES;    }	ASSERT(AsyncMacGuardRegionOk(pAdapter, sizeof(ASYNCMAC_ADAPTER)));#ifdef DEBUG	pAdapter->dwDebugSigStart = AA_SIG_START;	pAdapter->dwDebugSigEnd = AA_SIG_END;	DEBUGMSG (ZONE_ALLOC, (TEXT(" ASYNCMAC:MpInit: Allocated pAdapter 0x%X(%d)\r\n"),						   pAdapter, sizeof(ASYNCMAC_ADAPTER)));	#endif	pAdapter->hMiniportAdapter = MiniportAdapterHandle;    //    // Open the configuration space.    //    NdisOpenConfiguration(&Status, &ConfigHandle, WrapperConfigurationContext);    if (Status != NDIS_STATUS_SUCCESS)	{        AsyncMacFreeMemory(pAdapter, sizeof(ASYNCMAC_ADAPTER));        DEBUGMSG(ZONE_INIT,            (TEXT("NE2000:Initialize: NdisOpenConfiguration failed 0x%x\n"),            Status));        return Status;    }	pAdapter->Info.MaxFrameSize = MAX_FRAME_SIZE;    NdisReadConfiguration(&Status, &ReturnedValue, ConfigHandle, &MaxFrameSizeStr, NdisParameterInteger);    if (Status == NDIS_STATUS_SUCCESS)	{		pAdapter->Info.MaxFrameSize = ReturnedValue->ParameterData.IntegerData;		DEBUGMSG(ZONE_INIT,(TEXT("ASYNCMAC: MaxFrameSize=%d.\n"), pAdapter->Info.MaxFrameSize));    }		pAdapter->MaxSendFrameSize = pAdapter->Info.MaxFrameSize;    NdisReadConfiguration(&Status, &ReturnedValue, ConfigHandle, &MaxSendFrameSizeStr, NdisParameterInteger);    if (Status == NDIS_STATUS_SUCCESS)	{		pAdapter->MaxSendFrameSize = ReturnedValue->ParameterData.IntegerData;		DEBUGMSG(ZONE_INIT,(TEXT("ASYNCMAC: MaxSendFrameSize=%d.\n"), pAdapter->MaxSendFrameSize));    }	pAdapter->MaxRecvFrameSize = pAdapter->Info.MaxFrameSize;    NdisReadConfiguration(&Status, &ReturnedValue, ConfigHandle, &MaxRecvFrameSizeStr, NdisParameterInteger);    if (Status == NDIS_STATUS_SUCCESS)	{		pAdapter->MaxRecvFrameSize = ReturnedValue->ParameterData.IntegerData;		DEBUGMSG(ZONE_INIT,(TEXT("ASYNCMAC: MaxRecvFrameSize=%d.\n"), pAdapter->MaxRecvFrameSize));    }	pAdapter->dwRecvBufSize = DEFAULT_RX_BUF_SIZE;    NdisReadConfiguration(&Status, &ReturnedValue, ConfigHandle, &RecvBufSizeStr, NdisParameterInteger);    if (Status == NDIS_STATUS_SUCCESS)	{		pAdapter->dwRecvBufSize = ReturnedValue->ParameterData.IntegerData;		DEBUGMSG(ZONE_INIT,(TEXT("ASYNCMAC: RecvBufferSize=%d.\n"), pAdapter->dwRecvBufSize));    }	pAdapter->dwRecvThreadPrio = DEFAULT_RX_THREAD_PRIORITY;	NdisReadConfiguration(&Status, &ReturnedValue, ConfigHandle, &RecvThreadPrioStr, NdisParameterInteger);    if (Status == NDIS_STATUS_SUCCESS)	{		pAdapter->dwRecvThreadPrio = ReturnedValue->ParameterData.IntegerData;    }	DEBUGMSG(ZONE_INIT,(TEXT("ASYNCMAC: RecvThreadPrio=%d.\n"), pAdapter->dwRecvThreadPrio));	// Just close the config handle	NdisCloseConfiguration (ConfigHandle);	// Initialize our structure.	pAdapter->Info.MaxTransmit = 2;#define	ROUND_UP_TO_MULTIPLE_OF_N(value, N)	((value + N - 1) & ~(N - 1))	// For more info on HeaderPadding and TailPadding sizes see AssemblePPPFrame.	// HeaderPadding = 1 byte for opening flag (7e) + MaxFrameSize bytes to allow for insertion of escape bytes	// TailPadding   = 4 bytes for escaped 16 bit CRC + 1 byte for closing flag	//	// The header padding must be rounded up because the PPP code that builds a packet expects that	// PacketStartAddress + HeaderPadding will be DWORD aligned.	pAdapter->Info.HeaderPadding = ROUND_UP_TO_MULTIPLE_OF_N(1 + pAdapter->Info.MaxFrameSize, 4);	pAdapter->Info.TailPadding = 4 + 1;	pAdapter->Info.Endpoints = 1;	pAdapter->Info.MemoryFlags = 0;//	pAdapter->Info.HighestAcceptableAddress = NDIS_PHYSICAL_ADDRESS_CONST(-1,-1);	pAdapter->Info.FramingBits = PPP_FRAMING|SLIP_FRAMING;	pAdapter->Info.DesiredACCM = DEFAULT_ACCM;		// Tell NDIS about our handle    NdisMSetAttributesEx(MiniportAdapterHandle, (NDIS_HANDLE)pAdapter, 1000,						 0, NdisInterfaceInternal);			// Initialize TAPI#ifdef TODO	// Once we change the load order so that miniports get loaded after the	// system is initialized we can do the lineInitialize here.  In the meantime	// we'll use a lame function to sleep for awhile until we think the system	// might be happy.	{		long	lReturn;		lReturn = lineInitialize (&(pAdapter->hLineApp),								  v_hInstance, lineCallbackFunc, 								  TEXT("ASYNCMAC"), &(pAdapter->dwNumDevs));		DEBUGMSG (1, (TEXT("lineInitialize returned %d\r\n"),					  lReturn));		DEBUGMSG (1, (TEXT("lineInitialize say's there's %d devices\r\n"),					  pAdapter->dwNumDevs));		}#else	{		NdisMInitializeTimer (&(pAdapter->ntLineInit),							  pAdapter->hMiniportAdapter,							  DoLineInitialize, pAdapter);							  							  		NdisMSetTimer (&(pAdapter->ntLineInit), 1000);					  	}#endif	// Lot's more stuff.	EnterCriticalSection(&v_AdapterCS);	v_pAdapter = pAdapter;	v_GlobalAdapterCount++;	LeaveCriticalSection(&v_AdapterCS);	ASSERT(AsyncMacGuardRegionOk(pAdapter, sizeof(ASYNCMAC_ADAPTER)));	DEBUGMSG (ZONE_INIT|ZONE_INTERFACE, (TEXT("-ASYNCMAC:MpInit\r\n")));	    return NDIS_STATUS_SUCCESS;}NDIS_STATUSMapTapiErrorToNdisStatus(	IN	DWORD	dwTapiErrorCode)////	Translate a TAPI error code to an NDIS status.//{	NDIS_STATUS	NdisStatus;	switch(dwTapiErrorCode)	{	case 0:		NdisStatus = NDIS_STATUS_SUCCESS;		break;	case LINEERR_BADDEVICEID:	case LINEERR_INVALADDRESS:	case LINEERR_INVALAPPHANDLE:	case LINEERR_INVALPARAM:	case LINEERR_INVALPOINTER:	case LINEERR_INVALDEVICECLASS:	case LINEERR_STRUCTURETOOSMALL:		NdisStatus = NDIS_STATUS_TAPI_INVALPARAM;		break;	case LINEERR_CALLUNAVAIL:		NdisStatus = NDIS_STATUS_TAPI_CALLUNAVAIL;		break;	case LINEERR_INCOMPATIBLEEXTVERSION:		NdisStatus = NDIS_STATUS_TAPI_INCOMPATIBLEEXTVERSION;		break;	case LINEERR_INVALLINESTATE:		NdisStatus = NDIS_STATUS_TAPI_INVALLINESTATE;		break;	case LINEERR_INVALCARD:	case LINEERR_NODEVICE:	case LINEERR_UNINITIALIZED:		NdisStatus = NDIS_STATUS_TAPI_NODEVICE;		break;	case LINEERR_NODRIVER:		NdisStatus = NDIS_STATUS_TAPI_NODRIVER;		break;	case LINEERR_NOMEM:		NdisStatus = NDIS_STATUS_RESOURCES;		break;	case LINEERR_OPERATIONUNAVAIL:		NdisStatus = NDIS_STATUS_TAPI_OPERATIONUNAVAIL;		break;	case LINEERR_RESOURCEUNAVAIL:		NdisStatus = NDIS_STATUS_TAPI_RESOURCEUNAVAIL;		break;	case LINEERR_INCOMPATIBLEAPIVERSION:	case LINEERR_OPERATIONFAILED:		NdisStatus = NDIS_STATUS_FAILURE;		break;	default:		//		//	All TAPI codes should be covered explicitly, if		//	they are not we can catch them with the assert and		//	add them.		//		ASSERT(FALSE);		NdisStatus = NDIS_STATUS_FAILURE;		break;	}	return NdisStatus;}DWORD WINAPILineConfigDialogEditThread(	LPVOID pVArg){	PNDIS_TAPI_LINE_CONFIG_DIALOG_EDIT pConfigDlgEdit = (PNDIS_TAPI_LINE_CONFIG_DIALOG_EDIT)pVArg;	long lResult;	LPTSTR	szDeviceClass;	//	//	In case any of the data is on the application stack or heap...	//	SetProcPermissions(-1);	if (pConfigDlgEdit->ulDeviceClassLen) {		szDeviceClass = (LPTSTR)pConfigDlgEdit->DataBuf;	} else {		szDeviceClass = NULL;	}	lResult = lineConfigDialogEdit (pConfigDlgEdit->ulDeviceID,									pConfigDlgEdit->hwndOwner,									szDeviceClass,									pConfigDlgEdit->DataBuf + pConfigDlgEdit->ulConfigInOffset,									pConfigDlgEdit->ulConfigInSize,									(LPVARSTRING)(pConfigDlgEdit->DataBuf + pConfigDlgEdit->ulConfigOutOffset));	return (DWORD)lResult;}NDIS_STATUSMpQueryInfo(	IN	NDIS_HANDLE	MiniportAdapterContext,	IN	NDIS_OID	Oid,	IN	PVOID		InformationBuffer,	IN	ULONG		InformationBufferLength,	OUT PULONG		BytesWritten,	OUT PULONG		BytesNeeded	)/*++Routine Description:    The MpQueryProtocolInformation process a Query request for    NDIS_OIDs that are specific to a binding about the MAC.  Note that    some of the OIDs that are specific to bindings are also queryable    on a global basis.  Rather than recreate this code to handle the    global queries, I use a flag to indicate if this is a query for the    global data or the binding specific data.Arguments:    Adapter - a pointer to the adapter.    Oid - the NDIS_OID to process.Return Value:    The function value is the status of the operation.--*/{    NDIS_MEDIUM             Medium          = NdisMediumWan;	PASYNCMAC_ADAPTER		pAdapter = (PASYNCMAC_ADAPTER)MiniportAdapterContext;    NDIS_STATUS             StatusToReturn  = NDIS_STATUS_SUCCESS;    NDIS_HARDWARE_STATUS    HardwareStatus  = NdisHardwareStatusReady;    PVOID                   MoveSource;    ULONG                   MoveBytes;    ULONG                   GenericULong    = 0;    USHORT                  GenericUShort   = 0;    INT                     fDoCommonMove = TRUE;    UCHAR					WanAddress[6] = {' ','A','S','Y','N',0xFF};  // This is the address returned by OID_WAN_*_ADDRESS.		DEBUGMSG (ZONE_INIT|ZONE_INTERFACE,			  (TEXT("+ASYNCMAC:MpQueryInfo(0x%X, 0x%X(%hs), 0x%X, %d, 0x%X, 0x%X)\r\n"),			   MiniportAdapterContext, Oid, GetOidString(Oid),			   InformationBuffer, InformationBufferLength,			   BytesWritten, BytesNeeded));	ASSERT(CHK_AA(pAdapter));	    MoveSource = &GenericULong;    MoveBytes  = sizeof(GenericULong);		switch ( Oid ) {	case OID_GEN_SUPPORTED_LIST:		MoveSource = (PVOID) SupportedOids;		MoveBytes = sizeof(SupportedOids);		break;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?