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