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

📄 rilhandndisoem1.cpp

📁 windows mobile RIL软件
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				{
				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);
	pPdpContextEntry = GetNextPdpContextEntry();
	while (pPdpContextEntry)
		{ 
		ASSERT(pPdpContextEntry->AsyncCommandID);
		ASSERT(pPdpContextEntry->pCRilInstance);
		HRESULT Result=E_FAIL;	
		DWORD Index;

		DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: ProcessNextContextRequest	cid = %x, Activation = %s pCRilInstance = %x AsyncCommandID = %x\r\n"), 
				pPdpContextEntry->RilNdisGprsContext.dwContextID, 
				pPdpContextEntry->RilNdisGprsContext.fContextActivation ? L"TRUE" : L"FALSE", 
				pPdpContextEntry->pCRilInstance,
				pPdpContextEntry->AsyncCommandID));

		CPdpContext	*pCPdpContext = (CPdpContext*)NdisPdpContextFromCid( pPdpContextEntry->RilNdisGprsContext.dwContextID );

	   if ( !pPdpContextEntry->RilNdisGprsContext.fContextActivation )
			{
			if ( pCPdpContext) 
				{
				NdisAllocateCommand ( OEM_NDIS_CLOSE_COMPLETE, pPdpContextEntry->RilNdisGprsContext.dwContextID, (LPVOID)pPdpContextEntry->pCRilInstance, pPdpContextEntry->AsyncCommandID ); 
				Result = pCPdpContext->ActivateContext((PVOID) &pPdpContextEntry->RilNdisGprsContext);
				if ( FAILED(Result))
					{
					DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: ProcessNextContextRequest  CLOSE handle = %x Call FAILED\r\n"), pCPdpContext));
					NdisShutdownConnection ( pPdpContextEntry->RilNdisGprsContext.dwContextID );
					}
				else
					{
					DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: ProcessNextContextRequest  CLOSE handle = %x \r\n"), pCPdpContext));
					}
				}
			else // No connection object - no connection
				{
				Result = RIL_E_INVALIDCONTEXTSTATE; 
				}
			}
		else 
			{
			if ( NULL == pCPdpContext) // This should normally be the case.
				{ 
				// Check to see if there are any available to initialise.
				if ( SUCCEEDED(NdisGetFreeEntry( &Index)) )
					{
					HANDLE NdisRxMsgQueueWriteHandle = NdisGetRxMsgQueueWriteHandle();
					pCPdpContext = new CPdpContext(NdisRxMsgQueueWriteHandle);
					if ( pCPdpContext )
						{
						NdisAddNdisEntry(pPdpContextEntry->RilNdisGprsContext.dwContextID,	Index, pPdpContextEntry->pCRilInstance, pCPdpContext, &pPdpContextEntry->RilNdisGprsContext ); 
						NdisAllocateCommand ( OEM_NDIS_OPEN_COMPLETE, pPdpContextEntry->RilNdisGprsContext.dwContextID, (LPVOID)pPdpContextEntry->pCRilInstance, pPdpContextEntry->AsyncCommandID);
						Result = pCPdpContext->ActivateContext((PVOID) &pPdpContextEntry->RilNdisGprsContext);
						if ( FAILED(Result))
							{
							DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: ProcessNextContextRequest  OPEN FAILED \r\n")));
							NdisRemoveNdisEntry(pPdpContextEntry->RilNdisGprsContext.dwContextID);
							}
						else
							{
							DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: ProcessNextContextRequest  OPEN handle = %x \r\n"), pCPdpContext));
							}
						}
					}
				else
					{
					Result = RIL_E_MAXCONTEXTS;
					}
				}  
			else // connection object - connection
				{
				Result = RIL_E_INVALIDCONTEXTSTATE;
				}
			}

			// Process error condition
			if ( FAILED(Result) )
				{
				NdisRemoveCommand( pPdpContextEntry->AsyncCommandID );
				((CRilInstanceHandle*)pPdpContextEntry->pCRilInstance)->Notify(RIL_RESULT_ERROR, 
												pPdpContextEntry->AsyncCommandID, 
												&Result, 
												sizeof(Result));
				RemovePdpContextEntry(pPdpContextEntry);
				pPdpContextEntry = GetNextPdpContextEntry();
				}
			else
				{
				pPdpContextEntry = NULL;
				}

		}
	UnlockPdpContextList();
}




CRilInstanceNDIS::CRilInstanceNDIS()
{
	m_pCrilInstance = NULL;
}

CRilInstanceNDIS::~CRilInstanceNDIS()
{
	m_pCrilInstance = NULL;
}

void CRilInstanceNDIS::Init(PVOID hInstance)
{
	m_pCrilInstance = hInstance;
}

// **************************************************************************
// Function Name: NdisSendPacket
// 
// Purpose: 	  Add async command and make NDIS call.
//
// Arguments:	  IN ndis packet pointer
//
// Return Values:	E_FAIL if parameter or immediate failure detected.
//					Command result value for async response.
//
// Side effects:  
// 
// Description:   
// **************************************************************************
HRESULT  CRilInstanceNDIS::NdisSendPacket( RILNDISPACKET* lpNdisPacket ) 
{	
   return S_OK;
}



// **************************************************************************
// Function Name: NdisSetGPRSContextActivated
// 
// Purpose: 	 Bring the GRPS context up or down depending on input.
//
// Arguments:	 IN structure defining the connection details.
//
// Return Values:  E_FAIL if error detected.
//				   Command result for async response.
//
// Side effects:  
// 
// Description:   
// **************************************************************************
HRESULT  CRilInstanceNDIS::NdisSetGPRSContextActivated (const RILNDISGPRSCONTEXT *lpNdisSetGprsContextActivated )
{
	HRESULT Result=E_FAIL; 
	CRilHandle* pCrilHandle = ((CRilInstanceHandle*)m_pCrilInstance)->GetCrilHandle();
	HANDLE NdisRxMsgQueueWriteHandle = pCrilHandle->CRilNdis.NdisGetRxMsgQueueWriteHandle();
	HRESULT AsyncCommandID = 0;
	DWORD Index;


	if ( NdisRxMsgQueueWriteHandle && 
		pCrilHandle && 
		lpNdisSetGprsContextActivated && 
		lpNdisSetGprsContextActivated->dwContextID && 
		lpNdisSetGprsContextActivated->dwContextID <= pCrilHandle->CRilNdis.MaxContextID())
		{
		RILNDISGPRSCONTEXT NdisSetGprsContextActivated;
		CeSafeCopyMemory(&NdisSetGprsContextActivated, lpNdisSetGprsContextActivated, sizeof(NdisSetGprsContextActivated));

		if ( (TRUE == NdisSetGprsContextActivated.fContextActivation &&
			 NdisSetGprsContextActivated.pfnNdisReceive &&
			 NdisSetGprsContextActivated.pfnNdisTransmit &&
			 NdisSetGprsContextActivated.pfnNdisStatus) ||
             (FALSE ==NdisSetGprsContextActivated.fContextActivation)  )
			{
			// Force NULL-terminated string variables
			NdisSetGprsContextActivated.tszDNS1[ARRAY_LENGTH(NdisSetGprsContextActivated.tszDNS1)-1]= TCHAR ('\0');
			NdisSetGprsContextActivated.tszDNS2[ARRAY_LENGTH(NdisSetGprsContextActivated.tszDNS2)-1]= TCHAR ('\0');
			NdisSetGprsContextActivated.tszPassword[ARRAY_LENGTH(NdisSetGprsContextActivated.tszPassword)-1]= TCHAR ('\0');
			NdisSetGprsContextActivated.tszUserName[ARRAY_LENGTH(NdisSetGprsContextActivated.tszUserName)-1]= TCHAR ('\0');
		
			CPdpContext	*pCPdpContext = (CPdpContext*)pCrilHandle->CRilNdis.NdisPdpContextFromCid( NdisSetGprsContextActivated.dwContextID );
		
			DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: NdisSetGPRSContextActivated  cid = %x, Activation = %s \r\n"), 
					 NdisSetGprsContextActivated.dwContextID, NdisSetGprsContextActivated.fContextActivation ? L"TRUE" : L"FALSE" ));


			AsyncCommandID = pCrilHandle->GetNextCmdID();
			pCrilHandle->CRilNdis.LockPdpContextList();
			if ( FALSE == pCrilHandle->CRilNdis.IsPdpContextListEmpty())
				{
				DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: NdisSetGPRSContextActivated  Queueing Request Command ID = %x \r\n"), AsyncCommandID));
				Result = RIL_RESULT_OK;
				pCrilHandle->CRilNdis.AddPdpContextEntry(&NdisSetGprsContextActivated,AsyncCommandID,(PVOID)m_pCrilInstance);
				if ( !NdisSetGprsContextActivated.fContextActivation )
					{
					if (FALSE == WaitForCloseResponse())
						{
						pCrilHandle->CRilNdis.NdisRemoveCallbacks(NdisSetGprsContextActivated.dwContextID);
						((CRilInstanceHandle*)m_pCrilInstance)->Notify(Result, 

⌨️ 快捷键说明

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