📄 ttpcom.cpp
字号:
}
// **************************************************************************
// Function Name: NdisCountEvents
//
// Purpose: Convenience routine. Count number of events in WaitForMultipleObjects list.
//
// Arguments:
//
// Return Values:
//
// Side effects:
//
// Description:
// **************************************************************************
DWORD CRilNDISTTPCOM::NdisCountEvents(void)
{
DWORD dwCount=0;
for(int i=0;i<MAX_OEMNDIS_EVENTS;i++)
{
if ( !m_rgpNdisEvents.lpNdisEventHandlesPrimary[i] )
break;
else
dwCount++;
}
return dwCount;
}
// **************************************************************************
// Function Name: NdisGetFreeNdisEntry
//
// Purpose: Find an unused NDIS channel.
//
// Arguments: OUT index value if one is available.
//
// Return Values: E_FAIL if all indeces are in use.
//
// Side effects:
//
// Description:
// **************************************************************************
HRESULT CRilNDISTTPCOM::NdisGetFreeNdisEntry ( DWORD *lpIndex )
{
HRESULT hr = E_FAIL;
EnterCriticalSection(&m_csConnectionList);
for(DWORD i = FIRST_VALID_NDIS_INDEX; i < MAX_OEMNDIS_CHANNELS; i++)
{
if ( 0 == m_rgpNdisChannels[i].hNdisHandle )
{
hr = S_OK;
*lpIndex = i;
break;
}
}
LeaveCriticalSection(&m_csConnectionList);
return hr;
}
// **************************************************************************
// Function Name: NdisRemoveNdisEntry
//
// Purpose: Free an NDIS channel for use by others.
//
// Arguments: IN Handle to the NDIS channel
//
// Return Values:
//
// Side effects:
//
// Description:
// **************************************************************************
void CRilNDISTTPCOM::NdisRemoveNdisEntry ( HANDLE hNdisHandle )
{
EnterCriticalSection(&m_csConnectionList);
for(int i=FIRST_VALID_NDIS_INDEX;i<MAX_OEMNDIS_CHANNELS;i++)
{
if ( hNdisHandle && (m_rgpNdisChannels[i].hNdisHandle == hNdisHandle) )
{
m_NdisAsyncCommandList.RemoveAllCommands( hNdisHandle );
CloseHandle(hNdisHandle);
memset( &m_rgpNdisChannels[i], 0, sizeof(OEMNDISCHANNELS));
break;
}
}
LeaveCriticalSection(&m_csConnectionList);
}
// **************************************************************************
// Function Name: NdisCidFromHandle
//
// Purpose: Find the cid associated to a given NDIS channel handle.
//
// Arguments: IN NdisHandle, OUT lpCid
//
// Return Values: E_FAIL if not found.
//
// Side effects:
//
// Description:
// **************************************************************************
HRESULT CRilNDISTTPCOM:: NdisCidFromHandle( HANDLE hNdisHandle, DWORD *lpCid )
{
HRESULT hr = E_FAIL;
EnterCriticalSection(&m_csConnectionList);
for(int i=FIRST_VALID_NDIS_INDEX; i < MAX_OEMNDIS_CHANNELS; i++)
if ( hNdisHandle && (m_rgpNdisChannels[i].hNdisHandle == hNdisHandle) )
{
*lpCid = m_rgpNdisChannels[i].dwCid;
hr = S_OK;
break;
}
DEBUGMSG( ZONE_NDIS, (TEXT("RILNDIS: NdisCidFromHandle hr = %s ContextID = %x \r\n"),
(hr == S_OK) ? L"S_OK" : L"E_FAIL", *lpCid));
LeaveCriticalSection(&m_csConnectionList);
return hr;
}
// **************************************************************************
// Function Name: NdisOemNdisOpenRequestFromHandle
//
// Purpose: Find the cid associated to a given NDIS channel handle.
//
// Arguments: IN NdisHandle, OUT lpCid
//
// Return Values: E_FAIL if not found.
//
// Side effects:
//
// Description:
// **************************************************************************
HRESULT CRilNDISTTPCOM:: NdisOemNdisOpenRequestFromHandle( HANDLE hNdisHandle, RILNDISGPRSCONTEXT *lpRilNdisGprsContext )
{
HRESULT hr = E_FAIL;
EnterCriticalSection(&m_csConnectionList);
for(int i=FIRST_VALID_NDIS_INDEX; i < MAX_OEMNDIS_CHANNELS; i++)
{
if ( hNdisHandle && (m_rgpNdisChannels[i].hNdisHandle == hNdisHandle) && lpRilNdisGprsContext)
{
memmove( lpRilNdisGprsContext, &(m_rgpNdisChannels[i].RilNdisGprsContext), sizeof(*lpRilNdisGprsContext));
hr = S_OK;
break;
}
}
DEBUGMSG( ZONE_NDIS, (TEXT("RILNDIS: NdisOemNdisOpenRequestFromHandle hr = %s \r\n"),
(hr == S_OK) ? L"S_OK" : L"E_FAIL"));
LeaveCriticalSection(&m_csConnectionList);
return hr;
}
// **************************************************************************
// Function Name: NdisHandleFromCid
//
// Purpose: Search of the NDIS channel handle associated with a cid.
//
// Arguments: IN cid, OUT hNdisHandle
//
// Return Values: E_FAIL if not found.
//
// Side effects:
//
// Description:
// **************************************************************************
HRESULT CRilNDISTTPCOM::NdisHandleFromCid( DWORD cid, HANDLE *hNdisHandle )
{
HRESULT hr = E_FAIL;
EnterCriticalSection(&m_csConnectionList);
if ( TRUE == ValidChannelIndex ( cid ) )
{
for(int i=FIRST_VALID_NDIS_INDEX;i<MAX_OEMNDIS_CHANNELS;i++)
{
if ( (m_rgpNdisChannels[i].dwCid == cid) && m_rgpNdisChannels[i].hNdisHandle )
{
*hNdisHandle = m_rgpNdisChannels[i].hNdisHandle;
hr = S_OK;
break;
}
}
}
LeaveCriticalSection(&m_csConnectionList);
return hr;
}
// **************************************************************************
// Function Name: NdisRilCallbackFromCID
//
// Purpose: Search of the NDIS channel handle associated with a cid.
//
// Arguments: IN cid, OUT hNdisHandle
//
// Return Values: E_FAIL if not found.
//
// Side effects:
//
// Description:
// **************************************************************************
void CRilNDISTTPCOM::NdisRilCallbacksFromCID( DWORD ContextID, PVOID *pCallbackContext, RILNDISRECEIVECALLBACK *pfnRilReceiveCallback, RILNDISTRANSMITCALLBACK *pfnRilTransmitCallback, RILNDISSTATUSCALLBACK *pfnRilStatusCallback )
{
EnterCriticalSection(&m_csConnectionList);
*pfnRilReceiveCallback = NULL;
*pfnRilTransmitCallback = NULL;
*pfnRilStatusCallback = NULL;
*pCallbackContext = NULL;
for(int i=FIRST_VALID_NDIS_INDEX;i<MAX_OEMNDIS_CHANNELS;i++)
{
if ( ContextID && (m_rgpNdisChannels[i].dwCid == ContextID) )
{
*pfnRilReceiveCallback = m_rgpNdisChannels[i].RilNdisGprsContext.pfnNdisReceive;
*pfnRilTransmitCallback = m_rgpNdisChannels[i].RilNdisGprsContext.pfnNdisTransmit;
*pfnRilStatusCallback = m_rgpNdisChannels[i].RilNdisGprsContext.pfnNdisStatus;
*pCallbackContext = m_rgpNdisChannels[i].RilNdisGprsContext.pCallbackContext;
break;
}
}
LeaveCriticalSection(&m_csConnectionList);
}
// **************************************************************************
// Function Name: NdisRilInstanceFromHandle
//
// Purpose: Search of the NDIS channel handle associated with a cid.
//
// Arguments: IN cid, OUT hNdisHandle
//
// Return Values: E_FAIL if not found.
//
// Side effects:
//
// Description:
// **************************************************************************
VOID* CRilNDISTTPCOM::NdisRilInstanceFromHandle( HANDLE hNdisHandle )
{
HRESULT hr = E_FAIL;
VOID *pVoid = NULL;
EnterCriticalSection(&m_csConnectionList);
for(int i=FIRST_VALID_NDIS_INDEX;i<MAX_OEMNDIS_CHANNELS;i++)
{
if ( hNdisHandle && (m_rgpNdisChannels[i].hNdisHandle == hNdisHandle) )
{
pVoid = m_rgpNdisChannels[i].dwCrilInstance;
hr = S_OK;
break;
}
}
LeaveCriticalSection(&m_csConnectionList);
return pVoid;
}
// **************************************************************************
// Function Name: NdisRemoveCallbacks
//
// Purpose:
//
// Arguments:
//
// Return Values:
//
// Side effects:
//
// Description:
// **************************************************************************
void CRilNDISTTPCOM::NdisRemoveCallbacks ( DWORD ContextID )
{
DEBUGMSG( ZONE_NDIS, (TEXT("RILNDIS: NdisRemoveCallbacks cid = %x \r\n"), ContextID));
EnterCriticalSection(&m_csConnectionList);
for(int i=FIRST_VALID_NDIS_INDEX;i<MAX_OEMNDIS_CHANNELS;i++)
{
if ( m_rgpNdisChannels[i].RilNdisGprsContext.dwContextID == ContextID )
{
m_rgpNdisChannels[i].RilNdisGprsContext.pCallbackContext = NULL;
m_rgpNdisChannels[i].RilNdisGprsContext.pfnNdisReceive = NULL;
m_rgpNdisChannels[i].RilNdisGprsContext.pfnNdisStatus = NULL;
m_rgpNdisChannels[i].RilNdisGprsContext.pfnNdisTransmit = NULL;
break;
}
}
LeaveCriticalSection(&m_csConnectionList);
}
// **************************************************************************
// Function Name: NdisAddNdisEntry
//
// Purpose: Add an NDIS channel entry to mark its use.
//
// Arguments: IN cid, dwIndex, hHandle (NDIS channel handle), lpOemNdisEvent CrilInstance open structure
//
// Return Values:
//
// Side effects:
//
// Description:
// **************************************************************************
void CRilNDISTTPCOM::NdisAddNdisEntry ( DWORD cid, DWORD dwIndex, HANDLE hHandle, VOID *hCrilInstance, const RILNDISGPRSCONTEXT *lpRilNdisGprsContext )
{
DEBUGMSG( ZONE_NDIS, (TEXT("RILNDIS: NdisAddNdisEntry cid = %x, index = %x, handle = %x \r\n"), cid, dwIndex, hHandle));
EnterCriticalSection(&m_csConnectionList);
if ( hHandle && (TRUE == ValidChannelIndex ( dwIndex )) )
{
m_rgpNdisChannels[dwIndex].dwCid= cid;
m_rgpNdisChannels[dwIndex].hNdisHandle = hHandle;
m_rgpNdisChannels[dwIndex].dwCrilInstance = hCrilInstance;
CeSafeCopyMemory(&m_rgpNdisChannels[dwIndex].RilNdisGprsContext, lpRilNdisGprsContext, sizeof(m_rgpNdisChannels[dwIndex].RilNdisGprsContext));
}
LeaveCriticalSection(&m_csConnectionList);
}
// **************************************************************************
// Function Name: NdisConvertConfig
//
// Purpose:
//
// Arguments:
//
// Return Values:
//
// Side effects:
//
// Description:
// **************************************************************************
void CRilNDISTTPCOM::NdisConvertConfig ( const OEMNDISCONFIGURATION* lpOemNdisConfig, RILNDISIPCONFIG* lpRilNdisIpConfig)
{
if ( lpOemNdisConfig && lpRilNdisIpConfig )
{
memset( lpRilNdisIpConfig, 0, sizeof(RILNDISIPCONFIG));
lpRilNdisIpConfig->cbSize = sizeof(RILNDISIPCONFIG);
/* derive whether address is IPv4(default) or IPv6 */
lpRilNdisIpConfig->dwProtocol = RIL_PARAM_NDISIPCONFIG_PROTOCOL_IPV4;
if ( lpOemNdisConfig->ipAddress.length == IPV6_ADDRESS_LENGTH )
{
lpRilNdisIpConfig->dwProtocol = RIL_PARAM_NDISIPCONFIG_PROTOCOL_IPV6;
}
/* fill in protocol specific parameters */
if ( lpRilNdisIpConfig->dwProtocol == RIL_PARAM_NDISIPCONFIG_PROTOCOL_IPV4 )
{
lpRilNdisIpConfig->ipv4.dwFlags |= RIL_PARAM_NDISIPCONFIG_SUBNETMASK;
lpRilNdisIpConfig->ipv4.inSubnetMask = 0xffffff00;
if ( lpOemNdisConfig->ipAddress.length && lpOemNdisConfig->ipAddress.address )
{
lpRilNdisIpConfig->ipv4.dwFlags |= RIL_PARAM_NDISIPCONFIG_IPADDR;
lpRilNdisIpConfig->ipv4.dwFlags |= RIL_PARAM_NDISIPCONFIG_DEFAULTGATEWAY;
lpRilNdisIpConfig->ipv4.inIPAddress = myinet_addr( lpOemNdisConfig->ipAddress.address, lpOemNdisConfig->ipAddress.length );
lpRilNdisIpConfig->ipv4.inDefaultGateway = lpRilNdisIpConfig->ipv4.inIPAddress ^ 0xFF;
}
if ( lpOemNdisConfig->primaryDnsAddress.length && lpOemNdisConfig->primaryDnsAddress.address)
{
lpRilNdisIpConfig->ipv4.dwFlags |= RIL_PARAM_NDISIPCONFIG_PRIMARYDNS;
lpRilNdisIpConfig->ipv4.inPrimaryDNS = myinet_addr( lpOemNdisConfig->primaryDnsAddress.address, lpOemNdisConfig->primaryDnsAddress.length );
}
if ( lpOemNdisConfig->secondaryDnsAddress.length && lpOemNdisConfig->secondaryDnsAddress.address)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -