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

📄 rilhandndisoem1.cpp

📁 手机RILGSM实现的源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	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 ) 
{
	HRESULT hr=E_FAIL ;
	CPdpContext	*pCPdpContext = NULL;

	CRilHandle* pCrilHandle = ((CRilInstanceHandle*)m_pCrilInstance)->GetCrilHandle();
	
	NdisPacketTest ( lpNdisPacket );

	if ( pCrilHandle )
		{
		pCPdpContext = (CPdpContext*)pCrilHandle->CRilNdis.NdisPdpContextFromCid( lpNdisPacket->dwContextId );
		if ( pCPdpContext && (TRUE == pCPdpContext->IsActivated()))
			{
			BOOL Result;
			HANDLE TxMsgQueue = pCrilHandle->CRilNdis.NdisGetTxMsgQueue();
			OEMNDISEVENT OemNdisEvent;
			memset(&OemNdisEvent, 0, sizeof(OemNdisEvent));
			DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: NdisSendPacket Packet = %x, ContextID = %x \r\n"), lpNdisPacket, lpNdisPacket->dwContextId));  
	  
			OemNdisEvent.Type = OEM_NDIS_TX_PACKET;
			OemNdisEvent.pPacket = lpNdisPacket; 
			DumpPacket(lpNdisPacket);
			Result = WriteMsgQueue(TxMsgQueue, &OemNdisEvent, sizeof(OemNdisEvent),0, 0 );	
			ASSERT(Result);
			if( TRUE == Result )
				{
				hr = S_OK;
				}
			}
		else
			{
			DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: NdisSendPacket for ContextID = %x CONTEXT CLOSED\r\n"), lpNdisPacket->dwContextId));
			}
		}
	
   return hr;
}



// **************************************************************************
// 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, 
														AsyncCommandID, 
														&Result, 
														sizeof(Result));
						 pCrilHandle->CRilNdis.NdisRemoveCommand(AsyncCommandID);
						}
					}
				}
			else
				{
				if ( FALSE == NdisSetGprsContextActivated.fContextActivation )
					{
					if ( pCPdpContext) 
						{
						pCrilHandle->CRilNdis.NdisRemoveCallbacks(NdisSetGprsContextActivated.dwContextID);
						pCrilHandle->CRilNdis.NdisAllocateCommand ( OEM_NDIS_CLOSE_COMPLETE, NdisSetGprsContextActivated.dwContextID, (LPVOID)m_pCrilInstance, AsyncCommandID ); 
						Result = pCPdpContext->ActivateContext((PVOID) &NdisSetGprsContextActivated);
						if ( FAILED(Result))
							{
							DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: NdisSetGPRSContextActivated  CLOSE handle = %x Call FAILED\r\n"), pCPdpContext));
							pCrilHandle->CRilNdis.NdisShutdownConnection ( NdisSetGprsContextActivated.dwContextID );
							}
						else
							{
							DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: NdisSetGPRSContextActivated  CLOSE handle = %x \r\n"), pCPdpContext));
							pCrilHandle->CRilNdis.AddPdpContextEntry(&NdisSetGprsContextActivated,AsyncCommandID,(PVOID)m_pCrilInstance);
							if (FALSE == WaitForCloseResponse())
								{
								Result =  RIL_RESULT_OK;
								((CRilInstanceHandle*)m_pCrilInstance)->Notify(Result, 
														AsyncCommandID, 
														&Result, 
														sizeof(Result));
								pCrilHandle->CRilNdis.NdisRemoveCommand(AsyncCommandID);
								}
							}
						}
					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(pCrilHandle->CRilNdis.NdisGetFreeEntry( &Index)) )
							{
							pCPdpContext = new CPdpContext(NdisRxMsgQueueWriteHandle);
							if ( pCPdpContext )
								{
								pCrilHandle->CRilNdis.NdisAddNdisEntry(NdisSetGprsContextActivated.dwContextID,	Index, m_pCrilInstance, pCPdpContext, &NdisSetGprsContextActivated ); 
								pCrilHandle->CRilNdis.NdisAllocateCommand ( OEM_NDIS_OPEN_COMPLETE, NdisSetGprsContextActivated.dwContextID, (LPVOID)m_pCrilInstance, AsyncCommandID);
								Result = pCPdpContext->ActivateContext((PVOID) &NdisSetGprsContextActivated);
								if ( FAILED(Result))
									{
									pCrilHandle->CRilNdis.NdisRemoveNdisEntry(NdisSetGprsContextActivated.dwContextID);
									}
								else
									{
									pCrilHandle->CRilNdis.AddPdpContextEntry(&NdisSetGprsContextActivated,AsyncCommandID,(PVOID)m_pCrilInstance);
									}
								}
							}
						else
							{
							Result = RIL_E_MAXCONTEXTS;
							}
						}  
					else // connection object - connection
						{
						Result = RIL_E_INVALIDCONTEXTSTATE;
						}
					}
				}
				pCrilHandle->CRilNdis.UnlockPdpContextList();
			}
		}

	if ( FAILED(Result) )
		{
			pCrilHandle->CRilNdis.NdisRemoveCommand( AsyncCommandID );
			AsyncCommandID = Result;
		}

	return AsyncCommandID;
}

// **************************************************************************
// Function Name: NdisReceivePacketDone
// 
// Purpose: 	 Notify the NDIS radio that the Rx packet has been consumed.
//
// Arguments:	 IN Rx packet pointer
//
// Return Values:  E_FAIL if error detected.
//				   Command result for async response.
//
// Side effects:  
// 
// Description:   
// **************************************************************************
HRESULT CRilInstanceNDIS::NdisReceivePacketDone (RILNDISPACKET* lpNdisPacket)
{
	HRESULT hr = E_FAIL; 
	CRilHandle* pCrilHandle = ((CRilInstanceHandle*)m_pCrilInstance)->GetCrilHandle();
   
	if ( pCrilHandle && lpNdisPacket )
		{
		BOOL Result;
		HANDLE TxMsgQueue = pCrilHandle->CRilNdis.NdisGetTxMsgQueue();
		OEMNDISEVENT OemNdisEvent;
		memset(&OemNdisEvent, 0, sizeof(OemNdisEvent));
		DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: NdisReceivePacketDone Packet = %x, ContextID = %x \r\n"), lpNdisPacket, lpNdisPacket->dwContextId));  

		CPdpContext	*pCPdpContext = (CPdpContext*)pCrilHandle->CRilNdis.NdisPdpContextFromCid( lpNdisPacket->dwContextId );
		if ( pCPdpContext )
			{
			OemNdisEvent.Type = OEM_NDIS_RX_PACKET_COMPLETE;
			OemNdisEvent.pPacket = lpNdisPacket;
			PacketPointers ( OemNdisEvent.pPacket);
			Result = WriteMsgQueue(TxMsgQueue, &OemNdisEvent, sizeof(OemNdisEvent),0, 0 );
			ASSERT(Result);			 
			if( TRUE == Result )
				{
				hr = S_OK;
				}
			}
		}

	 return hr;
	 
}

CAsyncResponse::CAsyncResponse()
{
	InitializeCriticalSection(&m_cs);
	InitializeListHead(&m_AsyncPendingList);
	InitializeListHead(&m_AsyncFreeList);
}


CAsyncResponse::~CAsyncResponse()
{
	PASYNCCOMMAND pEntry;
	BOOL ExitNow = FALSE;
	//
	// Find entry with matching ContextID in our list of pending requests
	//
	AsyncListLock();
	while ( FALSE == ExitNow )
		{
		for (pEntry = (PASYNCCOMMAND)(m_AsyncPendingList.Flink);
			 TRUE;
			 pEntry = (PASYNCCOMMAND)pEntry->Node.Flink)
			{
			if (pEntry == (PASYNCCOMMAND)(&m_AsyncPendingList))
				{
				ExitNow = TRUE;
				break;
				}

			RemoveEntryList(&pEntry->Node);
			InsertTailList(&m_AsyncFreeList, &pEntry->Node);
			break;
			}
		}
	ExitNow = FALSE;
	while ( FALSE == ExitNow )
		{
		for (pEntry = (PASYNCCOMMAND)(m_AsyncFreeList.Flink);
			 TRUE;
			 pEntry = (PASYNCCOMMAND)pEntry->Node.Flink)
			{
			if (pEntry == (PASYNCCOMMAND)(&m_AsyncFreeList))
				{
				ExitNow = TRUE;
				break;
				}
			RemoveEntryList(&pEntry->Node);
			LocalFree ( pEntry );
			break;
			}
		}
	AsyncListUnlock();
}


⌨️ 快捷键说明

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