📄 rilhandndisoem1.cpp
字号:
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 + -