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

📄 rilmain.cpp

📁 手机RILGSM实现的源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    // Driver is going away. Clear event that
    // says RIL driver is up.
    if (g_hDriverPresentEvent)
    {
        ResetEvent(g_hDriverPresentEvent);
        (void)CloseHandle(g_hDriverPresentEvent);
        g_hDriverPresentEvent = NULL;
        g_RilLog.LogEvent(RILLOG_ZONE_PRESENCE, RILLOG_EVENT_RADIOREMOVED);
    }

    if (g_rfExternalCalltypeDetermination)
    {
        g_rfExternalCalltypeDetermination = FALSE;
        g_rlpfExternalCalltypeFunction = NULL;
        if (NULL != g_hCalltypeLib)
            FreeLibrary(g_hCalltypeLib);
        g_hCalltypeLib = NULL;
        DeleteCriticalSection(&g_csRingingCallData);    
        DeleteCriticalSection(&g_csDialedCallData);    
    }
	//	FreeInComingCallNAndToneSrvLibrary();


#ifdef OEM1_DRIVER
    // Close the wavedev driver
    if (g_hWavDev)
    {
        CloseHandle(g_hWavDev);
    }

    if (g_hGetRegistrationEvent)
    {
        CloseHandle(g_hGetRegistrationEvent);
    }
#endif

    if (!pDevice)
    {
        goto Error;
    }
    delete pDevice;

    
#ifdef OEM2_DRIVER
    if (g_hCPINNEvent)
    {
        (void)CloseHandle(g_hCPINNEvent);
        g_hCPINNEvent = NULL;
    }
#endif // OEM2_DRIVER
#ifdef RIL_RADIO_RESILIENCE
    g_cbLastLockCapsSize = 0;
    FreeBlob(g_pLastLockCaps);
    DeleteCriticalSection(&g_csReboot);
#else
    if (g_hCriticalErrorEvent)
    {
        (void)CloseHandle(g_hCriticalErrorEvent);
        g_hCriticalErrorEvent = NULL;
    }
#endif // ! RIL_RADIO_RESILIENCE

#ifdef RIL_WATSON_REPORT
    DeleteCriticalSection(&g_csRilInfoCache);    
#endif // RIL_WATSON_REPORT

#if defined(OEM1_GPRS_DEACT)
    DeleteCriticalSection(&g_csGPRSDeactLock);    
#endif // OEM1_GPRS_DEACT

    DeleteCriticalSection(&g_csDeactCringLock); 

    DeleteCriticalSection(&g_csClosing);
    
//    DeleteCriticalSection(&g_csIncomingcallBlock);
    DeleteCriticalSection(&g_csManualSearchNetwork);
    fRet = TRUE;

    Error:
    return fRet;
}


//
// Open a driver instance
//
DWORD RLO_Open(DWORD dwData, DWORD dwAccess, DWORD dwShareMode)
{
    FUNCTION_TRACE(RLO_Open);
    DEBUGCHK(dwData != 0);

    CRilInstanceHandle* pHandle = NULL;
    CRilHandle* pDevice = RILHANDLE_FROM_DRIVERCOOKIE(dwData);
#ifdef RIL_ALLOW_DRIVER_REMOVAL_TESTING
    if (!g_pDeviceAllowDriverRemovalTesting)
    {
        return 0x4321;
    }
#endif
    DWORD dwRet = 0;

    // Wait until the COM port is initialized
    if (!pDevice /* || !pDevice->WaitForInit(MAX_DRIVERINIT_TIME) */ )
    {
        goto Error;
    }

    pHandle = new CRilInstanceHandle;
    if (!pHandle || !pHandle->Init(pDevice))
    {
        goto Error;
    }

    // Insert new handle into the handle list
    if (!pDevice->AddToList(pHandle))
    {
        goto Error;
    }

    dwRet = (DWORD)pHandle;

    Error:
    if (!dwRet)
    {
        delete pHandle;
    }
    return dwRet;
}


//
// Close a driver instance
//
BOOL RLO_Close(DWORD dwOpenData)
{
    FUNCTION_TRACE(RLO_Close);
    DEBUGCHK(dwOpenData != 0);

#ifdef RIL_ALLOW_DRIVER_REMOVAL_TESTING
    if (dwOpenData == 0x4321 || !g_pDeviceAllowDriverRemovalTesting)
    {
        return TRUE;
    }
#endif
    CRilInstanceHandle* pHandle = (CRilInstanceHandle*)dwOpenData;
    BOOL fRet = FALSE;

    if (!pHandle)
    {
        goto Error;
    }

    {
        SYNCBLOCK(g_csClosing);

        // Make sure no commands refer to this handle
        pHandle->GetCmdList()->Enum(ClearCmdHandle, 0);
    }

    DEBUGCHK(pHandle->GetDevice() != 0);

    // Remove the handle from the handle list
    if (!pHandle->GetDevice()->RemoveFromList(pHandle))
    {
        goto Error;
    }

    delete pHandle;
    fRet = TRUE;

    Error:
    return fRet;
}



//
// Emulate serial read
//
DWORD RLO_Read(DWORD dwOpenData, LPVOID pBuf, DWORD len)
{
#ifdef RIL_ALLOW_DRIVER_REMOVAL_TESTING
    if (g_pDeviceAllowDriverRemovalTesting)
    {
        RLO_Close(dwOpenData);
        RLO_Deinit(1);
        g_pDeviceAllowDriverRemovalTesting = NULL;
    }
#endif
    return 0;
}


//
// Emulate serial write
//
DWORD RLO_Write(DWORD dwOpenData, LPCVOID pBuf, DWORD len)
{
#ifdef RIL_ALLOW_DRIVER_REMOVAL_TESTING
    if (!g_pDeviceAllowDriverRemovalTesting)
    {
        ASSERT(dwOpenData == 0x4321);
        RLO_Init(1);
    }
#endif
    return 0;
}


//
//
//
DWORD RLO_Seek(DWORD dwOpenData, long pos, DWORD type)
{
    return (DWORD)-1;
}


//
// Defines used in the switch below
//
#define CALLDRVAPI_PARAMS(PARAMSTYPE, APICall)              \
    {                                                       \
        PARAMSTYPE##* pParams = (##PARAMSTYPE##*)pBufIn;    \
        if (pBufIn && dwLenIn == sizeof(PARAMSTYPE)) {      \
            *phr = APICall;                                 \
            dwOutUsed = sizeof(HRESULT);                    \
            fRet = TRUE;                                    \
        }                                                   \
    }

#define CALLDRVAPI_VARPARAMS(PARAMSTYPE, APICall)           \
    {                                                       \
        PARAMSTYPE##* pParams = (##PARAMSTYPE##*)pBufIn;    \
        if (pBufIn && dwLenIn >= sizeof(PARAMSTYPE)) {      \
            *phr = APICall;                                 \
            dwOutUsed = sizeof(HRESULT);                    \
            fRet = TRUE;                                    \
        }                                                   \
    }

#define CALLDRVAPI_OPTVARPARAMS(PARAMSTYPE, APICall)        \
    {                                                       \
        PARAMSTYPE##* pParams = (##PARAMSTYPE##*)pBufIn;    \
        if (!pBufIn || dwLenIn >= sizeof(PARAMSTYPE)) {     \
            *phr = APICall;                                 \
            dwOutUsed = sizeof(HRESULT);                    \
            fRet = TRUE;                                    \
        }                                                   \
    }

#define CALLDRVAPI_ARRAY(ELEMTYPE, APICall)                 \
    {                                                       \
        ELEMTYPE##* pParams = (##ELEMTYPE##*)pBufIn;        \
        if (pBufIn) {                                       \
            *phr = APICall;                                 \
            dwOutUsed = sizeof(HRESULT);                    \
            fRet = TRUE;                                    \
        }                                                   \
    }

#define CALLDRVAPI(APIName)                                 \
    *phr = APIName(dwOpenData);                             \
    dwOutUsed = sizeof(HRESULT);                            \
    fRet = TRUE;


//
//
//
BOOL RLO_IOControl(DWORD dwOpenData, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut,
                   PDWORD pdwActualOut)
{
    FUNCTION_TRACE(RLO_IOControl);
    DEBUGCHK(dwOpenData != 0);

    DWORD dwOutUsed = 0;
    BOOL fRet = FALSE;

#ifdef RIL_ALLOW_DRIVER_REMOVAL_TESTING
    if (!g_pDeviceAllowDriverRemovalTesting)
    {
        ASSERT(!"RLO_IOControl should not be called after the driver has gone away");
        return FALSE;
    }
#endif

    CRilInstanceHandle* pHandle = (CRilInstanceHandle*)dwOpenData;
    if (!pHandle)
    {
        goto Error;
    }

    if(SUCCEEDED(ValidateAPIPermission(TEXT("RILGSM"), TEXT("IOControl"), VAP_TRUST_CALLER)))  // Perform security check
    {
        switch (dwCode)
        {
        // CPM is ready for us to register with it
        case IOCTL_RIL_REGISTERWITHCPM:
            {
#ifdef RIL_RADIO_RESILIENCE
                // no longer supported
                fRet = FALSE;
#else
                CRilHandle* pRilDevice = pHandle->GetDevice();
                DEBUGCHK(NULL != pRilDevice);
                fRet = pRilDevice->RegisterWithCPM();
#endif // ! RIL_RADIO_RESILIENCE
            }
            break;

            // This handle will be used for an emergency call - it should be marked as preferred and RIL should be
            //    switched into "emergency mode"
        case IOCTL_RIL_EMERGENCYSTATUS:
            fRet = pHandle->MakePreferred();
            break;

            // Initialize notification delivery
        case IOCTL_RIL_INITNOTIFICATIONS:
            if (pBufIn)
            {
                fRet = pHandle->CreateNotificationQueue((LPCTSTR)pBufIn, pBufOut, dwLenOut, &dwOutUsed);
            }
            break;

            // Get next RIL notification
        case IOCTL_RIL_GETNEXTNOTIFICATION:
            {
                RILDRVNOTIFICATION* pResult = (RILDRVNOTIFICATION*)pBufOut;
                if (pBufOut && dwLenOut >= sizeof(RILDRVNOTIFICATION) &&
                    SUCCEEDED(RILDrv_GetNextNotification(dwOpenData, pResult)))
                {

                    dwOutUsed = pResult->cbSize;
                    fRet = TRUE;
                }
                break;
            }

            // RIL_GetSerialPortStatistics()
        case IOCTL_RIL_GETSERIALPORTSTATISTICS:
            {

⌨️ 快捷键说明

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