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

📄 rilhandndisoem1.cpp

📁 手机RILGSM实现的源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
							NdisRilCallbacksFromCID( ContextIDIndex,  &pCallbackContext, &pfnRilReceiveCallback, &pfnRilTransmitCallback, &pfnRilStatusCallback );
   
							if ( pfnRilStatusCallback )
								{
								RilNdisStatus.dwContextId=ContextIDIndex;
								pfnRilStatusCallback(pCallbackContext,&RilNdisStatus);
								}
							else 
								{
								DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: %s WARNING No Callback on context %x\r\n"),(OemNdisEvent.Type == OEM_NDIS_XON) ? L"OEM_NDIS_XON" : L"OEM_NDIS_XOFF", ContextIDIndex));	
								}	
							}					   
						break; 

						case OEM_NDIS_IP_CONFIGURATION: 
						memset ( &RilNdisIpConfig, 0, sizeof(RILNDISIPCONFIG));
						NdisConvertConfig ( &OemNdisEvent.IpConfig, &RilNdisIpConfig);
						RilNdisIpConfig.dwContextId = OemNdisEvent.ContextID;
						DumpNdisIPConfig( &RilNdisIpConfig );
						RilNdisStatus.dwContextId=OemNdisEvent.ContextID;
						RilNdisStatus.dwSize=sizeof(RilNdisStatus);
						RilNdisStatus.dwStatusType=RIL_PARAM_RILNDISSTATUS_IPCONFIG;
						RilNdisStatus.pRilNdisIpConfig=&RilNdisIpConfig;
						pfnRilStatusCallback = NULL;
						NdisRilCallbacksFromCID( OemNdisEvent.ContextID,  &pCallbackContext, &pfnRilReceiveCallback, &pfnRilTransmitCallback, &pfnRilStatusCallback );
							   
						if ( pfnRilStatusCallback )
							{
							pfnRilStatusCallback(pCallbackContext,&RilNdisStatus);
							}
						else 
							{
							DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: OEM_NDIS_IP_CONFIGURATION WARNING No Callback \r\n")));  
							}	
						ProcessNextContextRequest();
						break;

						case OEM_NDIS_OPEN_COMPLETE: 
						NdisRilCallbacksFromCID( OemNdisEvent.ContextID,  &pCallbackContext, &pfnRilReceiveCallback, &pfnRilTransmitCallback, &pfnRilStatusCallback );										 
						if ( NULL == pfnRilStatusCallback )
							{
							OemNdisEvent.Status = RIL_E_CANCELLED;
							}
						OemNdisApiReference.Status = OemNdisEvent.Status;
						OemNdisApiReference.EventType= OEM_NDIS_OPEN_COMPLETE;
						OemNdisApiReference.ContextID = OemNdisEvent.ContextID;
						m_NdisAsyncCommandList.ProcessCommand ( &OemNdisApiReference ); 
						if ( OemNdisEvent.Status ) // FAILURE!
							{
							pCPdpContext = (CPdpContext*)NdisPdpContextFromCid( OemNdisEvent.ContextID );
							ASSERT(pCPdpContext);
							pCPdpContext->CloseContext(OemNdisEvent.ContextID);
							NdisShutdownConnection ( OemNdisEvent.ContextID);
							ProcessNextContextRequest();
							}
						else
							{	
							RilGprsContexActivated.cbSize = sizeof(RILGPRSCONTEXTACTIVATED);
							RilGprsContexActivated.fActivated = TRUE;
							RilGprsContexActivated.dwContextID = OemNdisEvent.ContextID;
							RilGprsContexActivated.dwEvent = RIL_RILGPRSCONTEXTACTIVATED_MEACT;
							((CRilHandle*)m_pCRilHandle)->BroadcastRealBlobNotification(RIL_NOTIFY_GPRSCONNECTIONSTATUS, &RilGprsContexActivated, sizeof(RILGPRSCONTEXTACTIVATED));
							}
						break;
					
						case OEM_NDIS_CLOSE_COMPLETE: 
						OemNdisApiReference.Status = OemNdisEvent.Status;
						OemNdisApiReference.EventType= OEM_NDIS_CLOSE_COMPLETE;
						OemNdisApiReference.ContextID = OemNdisEvent.ContextID;
						m_NdisAsyncCommandList.ProcessCommand ( &OemNdisApiReference );
						NdisShutdownConnection ( OemNdisEvent.ContextID );

						// Now notify the driver that the context is closed 
						WriteMsgQueue(m_TxMsgQueue, &OemNdisEvent, sizeof(OemNdisEvent),0, 0 );
						ProcessNextContextRequest();
						break;
						}
				   }
				}
				continue;
			}
		else
			{
			ASSERT(0);
			}
		
		}while(1);

Exit:
	CloseMsgQueue (m_RxMsgQueue);
	CloseMsgQueue (m_TxMsgQueue);
	CloseMsgQueue (m_RxMsgQueueWrite);
	CloseMsgQueue (m_TxMsgQueueRead);
	if ( m_pNdisChannels )
		{
		LocalFree(m_pNdisChannels);
		}
	
	return 0;
}


// **************************************************************************
// Function Name:	NdisAllocateCommand
// 
// Purpose:    Allocate an asynchronous command. This method is used
//			   when the response will key off of the event type.
//
// Arguments:  IN eType: expected event.
//
// Return Values:  
//
// Side effects:  
// 
// Description:   
// **************************************************************************
void CRilNDIS::NdisAllocateCommand (  OEMNDISEVENTTYPE Type, DWORD ContextID, LPVOID pCRilInstance, HRESULT CommandID )
{
	if ( ContextID && pCRilInstance )
		{
		OEMNDISAPIREFERENCE OemNdisApiReference;
		memset(&OemNdisApiReference,0,sizeof(OemNdisApiReference));
	
		OemNdisApiReference.pCRilInstance = pCRilInstance;
		OemNdisApiReference.EventType = Type;
		OemNdisApiReference.ContextID = ContextID;
		OemNdisApiReference.CommandID = CommandID; 
		m_NdisAsyncCommandList.AddCommand ( &OemNdisApiReference );
		}	
}

void 
CRilNDIS:: NdisRemoveCommand ( HRESULT hrCommandID )
{
	if ( hrCommandID )
		{
		m_NdisAsyncCommandList.RemoveCommand ( hrCommandID );
		}
}

void CRilNDIS::NdisConvertConfig ( const OEMNDISIPCONFIG* pOemNdisConfig,  RILNDISIPCONFIG* pRilNdisIpConfig)
{
	if ( pOemNdisConfig && pRilNdisIpConfig )
		{
		memset( pRilNdisIpConfig, 0, sizeof(RILNDISIPCONFIG));
		pRilNdisIpConfig->cbSize = sizeof(RILNDISIPCONFIG);

		/* derive whether address is IPv4(default) or IPv6 */
		pRilNdisIpConfig->dwProtocol = RIL_PARAM_NDISIPCONFIG_PROTOCOL_IPV4;
		if ( pOemNdisConfig->ipAddress.length == IPV6_ADDRESS_LENGTH )
			{
			pRilNdisIpConfig->dwProtocol = RIL_PARAM_NDISIPCONFIG_PROTOCOL_IPV6;
			}

		/* fill in protocol specific parameters */
		if ( pRilNdisIpConfig->dwProtocol == RIL_PARAM_NDISIPCONFIG_PROTOCOL_IPV4 )
			{
			pRilNdisIpConfig->ipv4.dwFlags |= RIL_PARAM_NDISIPCONFIG_SUBNETMASK;
			pRilNdisIpConfig->ipv4.inSubnetMask = 0xffffff00;

			if ( pOemNdisConfig->ipAddress.length && pOemNdisConfig->ipAddress.address )
				{
				pRilNdisIpConfig->ipv4.dwFlags |= RIL_PARAM_NDISIPCONFIG_IPADDR;
				pRilNdisIpConfig->ipv4.dwFlags |= RIL_PARAM_NDISIPCONFIG_DEFAULTGATEWAY;
				pRilNdisIpConfig->ipv4.inIPAddress = myinet_addr( pOemNdisConfig->ipAddress.address, pOemNdisConfig->ipAddress.length );
				pRilNdisIpConfig->ipv4.inDefaultGateway = pRilNdisIpConfig->ipv4.inIPAddress ^ 0xFF;
				}

			if ( pOemNdisConfig->primaryDnsAddress.length && pOemNdisConfig->primaryDnsAddress.address)
				{
				pRilNdisIpConfig->ipv4.dwFlags |= RIL_PARAM_NDISIPCONFIG_PRIMARYDNS;
				pRilNdisIpConfig->ipv4.inPrimaryDNS = myinet_addr( pOemNdisConfig->primaryDnsAddress.address, pOemNdisConfig->primaryDnsAddress.length );
				}

			if ( pOemNdisConfig->secondaryDnsAddress.length && pOemNdisConfig->secondaryDnsAddress.address)
				{
				pRilNdisIpConfig->ipv4.dwFlags |= RIL_PARAM_NDISIPCONFIG_SECONDARYDNS;
				pRilNdisIpConfig->ipv4.inSecondaryDNS = myinet_addr( pOemNdisConfig->secondaryDnsAddress.address, pOemNdisConfig->secondaryDnsAddress.length );
				}
			}
		else if ( pRilNdisIpConfig->dwProtocol == RIL_PARAM_NDISIPCONFIG_PROTOCOL_IPV6 )
			{
			if ( pOemNdisConfig->ipAddress.length )
				{
				pRilNdisIpConfig->ipv6.dwFlags |= RIL_PARAM_NDISIPCONFIG_IPV6_IPADDR;
				pRilNdisIpConfig->ipv6.inIPAddress = myinet_ipv6addr( pOemNdisConfig->ipAddress.address, pOemNdisConfig->ipAddress.length );

				UCHAR subnetmask[IPV6_ADDRESS_LENGTH];
				memset( subnetmask, 0xFF, sizeof(subnetmask) );
				pRilNdisIpConfig->ipv6.dwFlags |= RIL_PARAM_NDISIPCONFIG_IPV6_SUBNETMASK;
				pRilNdisIpConfig->ipv6.inSubnetMask = myinet_ipv6addr( subnetmask, IPV6_ADDRESS_LENGTH );

				pRilNdisIpConfig->ipv6.dwFlags |= RIL_PARAM_NDISIPCONFIG_IPV6_DEFAULTGATEWAY;
				pRilNdisIpConfig->ipv6.inDefaultGateway = pRilNdisIpConfig->ipv6.inIPAddress;
				}

			if ( pOemNdisConfig->primaryDnsAddress.length )
				{
				pRilNdisIpConfig->ipv6.dwFlags |= RIL_PARAM_NDISIPCONFIG_IPV6_PRIMARYDNS;
				pRilNdisIpConfig->ipv6.inPrimaryDNS = myinet_ipv6addr( pOemNdisConfig->primaryDnsAddress.address, pOemNdisConfig->primaryDnsAddress.length );
				}

			if ( pOemNdisConfig->secondaryDnsAddress.length )
				{
				pRilNdisIpConfig->ipv6.dwFlags |= RIL_PARAM_NDISIPCONFIG_IPV6_SECONDARYDNS;
				pRilNdisIpConfig->ipv6.inSecondaryDNS = myinet_ipv6addr( pOemNdisConfig->secondaryDnsAddress.address, pOemNdisConfig->secondaryDnsAddress.length );
				}
			}
		}
}

inline void
CRilNDIS::PdpContextLock()
{
	EnterCriticalSection(&m_PdpContextCriticalSection);
}

inline void
CRilNDIS::PdpContextUnlock()
{
	LeaveCriticalSection(&m_PdpContextCriticalSection);
}

inline BOOL
CRilNDIS::IsPdpContextLocked()
{
	return m_PdpContextCriticalSection.OwnerThread == (HANDLE)GetCurrentThreadId();
}

PPDP_CONTEXT_ENTRY
CRilNDIS::PdpContextEntryGet()
{
	PPDP_CONTEXT_ENTRY pEntry = NULL;

	ASSERT(IsPdpContextLocked());

	if (!IsListEmpty(&m_PdpContextFreeList))
		{
		pEntry = (PPDP_CONTEXT_ENTRY)RemoveHeadList(&m_PdpContextFreeList);
		}

	if (pEntry == NULL)
		{
		pEntry = (PPDP_CONTEXT_ENTRY)LocalAlloc(LPTR, sizeof(*pEntry));
		}

	if ( pEntry )
		{
		pEntry->AsyncCommandID = 0;
		pEntry->pCRilInstance = NULL;
		memset(&pEntry->RilNdisGprsContext, 0, sizeof(pEntry->RilNdisGprsContext));
		}

	return pEntry;
}

void 
CRilNDIS::DumpPdpContextList ( void )
{

	PPDP_CONTEXT_ENTRY pEntry;
	PdpContextLock();
	//
	// Find entry with matching ContextID in our list of pending requests
	//

	for (pEntry = (PPDP_CONTEXT_ENTRY)(m_PdpContextPendingList.Flink);
		 TRUE;
		 pEntry = (PPDP_CONTEXT_ENTRY)pEntry->Node.Flink)
		{
		if (pEntry == (PPDP_CONTEXT_ENTRY)(&m_PdpContextPendingList))
			{
			break;
			}
		DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: DumpPdpContextList	pPdpContextEntry = %x \r\n"), pEntry));
		}
	PdpContextUnlock();

}

void 
CRilNDIS::AddPdpContextEntry( const RILNDISGPRSCONTEXT *pRilNdisGprsContext, HRESULT AsyncCommandID, PVOID pCRilInstance )
{
	PPDP_CONTEXT_ENTRY pEntry;
	PdpContextLock();
	pEntry = PdpContextEntryGet();
	ASSERT(pEntry);
	if ( pEntry )
		{
		pEntry->AsyncCommandID = AsyncCommandID;
		pEntry->pCRilInstance = pCRilInstance;
		CeSafeCopyMemory(&pEntry->RilNdisGprsContext,pRilNdisGprsContext,sizeof(pEntry->RilNdisGprsContext));
		InsertTailList(&m_PdpContextPendingList, &pEntry->Node);
		}
	PdpContextUnlock();
	DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: AddPdpContextEntry	pPdpContextEntry = %x \r\n"), pEntry));
	DumpPdpContextList();
}

void 
CRilNDIS::RemovePdpContextEntry( PPDP_CONTEXT_ENTRY pPdpContextEntry )
{
	PPDP_CONTEXT_ENTRY pEntry;
	PdpContextLock();
	//
	// Find entry with matching ContextID in our list of pending requests
	//

	DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: RemovePdpContextEntry  pPdpContextEntry = %x \r\n"), pPdpContextEntry));

	for (pEntry = (PPDP_CONTEXT_ENTRY)(m_PdpContextPendingList.Flink);
		 TRUE;
		 pEntry = (PPDP_CONTEXT_ENTRY)pEntry->Node.Flink)
		{
		if (pEntry == (PPDP_CONTEXT_ENTRY)(&m_PdpContextPendingList))
			{
			ASSERT(0);
			break;
			}

		if ( pEntry == pPdpContextEntry )
			{
			RemoveEntryList(&pEntry->Node);
			InsertTailList(&m_PdpContextFreeList, &pEntry->Node);
			break;
			}
		}
	PdpContextUnlock();
	DumpPdpContextList();

}


PPDP_CONTEXT_ENTRY
CRilNDIS::GetNextPdpContextEntry(  void )
{
	PPDP_CONTEXT_ENTRY pEntry;
	PPDP_CONTEXT_ENTRY pReturnEntry = NULL;
	PdpContextLock();
	//
	// Find entry with matching ContextID in our list of pending requests
	//
	for (pEntry = (PPDP_CONTEXT_ENTRY)(m_PdpContextPendingList.Flink);
		 TRUE;
		 pEntry = (PPDP_CONTEXT_ENTRY)pEntry->Node.Flink)
		{
		if (pEntry == (PPDP_CONTEXT_ENTRY)(&m_PdpContextPendingList))
			{
			break;
			}
		else
			{
			pReturnEntry = pEntry;
			break;
			}
		}
	PdpContextUnlock();

	DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: GetNextPdpContextEntry	pReturnEntry = %x \r\n"), pReturnEntry));
	return pReturnEntry;
}

BOOL			
CRilNDIS::IsPdpContextListEmpty( void )
{
	BOOL fReturn = IsListEmpty(&m_PdpContextPendingList);
	DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: IsPdpContextListEmpty = %s \r\n"), 
			fReturn ? L"TRUE" : L"FALSE"));

	return fReturn;
}

void 
CRilNDIS::RemoveAndSignalAllPdpContextEntries ( DWORD ContextID )
{
	PPDP_CONTEXT_ENTRY pEntry;
	DWORD ResultDetails;
	BOOL	ExitNow = FALSE;

	PdpContextLock();
	//
	// Find entry with matching ContextID in our list of pending requests
	//
	while ( FALSE == ExitNow )
		{
		for (pEntry = (PPDP_CONTEXT_ENTRY)(m_PdpContextPendingList.Flink);
			 TRUE;
			 pEntry = (PPDP_CONTEXT_ENTRY)pEntry->Node.Flink)
			{
			if (pEntry == (PPDP_CONTEXT_ENTRY)(&m_PdpContextPendingList))
				{
				ExitNow = TRUE;
				break;
				}
			if ( pEntry->RilNdisGprsContext.dwContextID== ContextID )
				{
				ResultDetails = RIL_RESULT_ERROR;
				((CRilInstanceHandle*)pEntry->pCRilInstance)->Notify(RIL_RESULT_ERROR,	pEntry->AsyncCommandID, &ResultDetails, sizeof(ResultDetails));
				RemoveEntryList(&pEntry->Node);
				InsertTailList(&m_PdpContextFreeList, &pEntry->Node);
				break;
				}
			}
		}
	PdpContextUnlock();

}

void			
CRilNDIS::ProcessNextContextRequest(void)

{
	PPDP_CONTEXT_ENTRY	pPdpContextEntry=NULL;
	DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: ProcessNextContextRequest \r\n")));
	LockPdpContextList();
	pPdpContextEntry = GetNextPdpContextEntry();
	ASSERT(pPdpContextEntry);
	RemovePdpContextEntry(pPdpContextEntry);

⌨️ 快捷键说明

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