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

📄 ttpcom.cpp

📁 我自己编译的armv4i wince60模拟器的bps源文件,已经验证可以使用,欢迎下载
💻 CPP
📖 第 1 页 / 共 5 页
字号:
}

// **************************************************************************
// 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 + -