📄 secur.cpp
字号:
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (c) 1995-1999 Microsoft Corporation
Module Name:
secur.cpp
Abstract:
Notes:
--*/
//------------------------------------------------------------------------------
// Revision History
// Date Author Activity ID Activity Headline
// 2006-02-20 wangzhengang CEDB00006684 The roaming state is not normal
// 2006-03-03 wangzhengang CEDB00007941 service display error
// 2006-03-13 caibeibei CEDB00009451 remove 手机主界面显示通信运营商错误
// 2006-03-23 liuhongjie CEDB00011160 A CMCC sim card with MNC: 02, An Roaming Icon will be displayed
// But in fact, it's not Roaming status.
// 2007-06-09 xiefei CEDB00011160 Remove spec notify to APP for block MS popup the pin window
// 2007-09-03 Cuiguoqing WM600013374 Synchronize codes between Projec Gallic and Projec Cynthia850.
// 2007-09-20 Cuiguoqing WM600017567 Modify codes in order to input PIN code for TI modem automatically.
// 2007-11-06 Cuiguoqing WM600021830 fix the bug that no service after change pin with wrong original pin in Cynthia850_ver2.07.
// 2007-11-16 qinxuetao WM600021585 Sending AT+COPS=0 only after unlocking PIN
// 2008-01-22 Cuiguoqing WM600029911 change unlock phone timeout time and add two parameters for QueueCmd function for TI.
// 2008-02-28 Cuiguoqing WM600032420 modify for save pin correctly after enable FDN with pin2.
//------------------------------------------------------------------------------
#include "precomp.h"
#include "rilproxyext_ioctl.h"
//static DWORD gPINbackTimes = 0;
//static CRilInstanceHandle* g_pHandle = NULL;
//add by fengguisen for test
BOOL g_HasGetISMI = FALSE;
LPCSTR g_szUserIdentityString;
extern BOOL g_bChangeCardPin;
//end add
//
//
//
#ifdef CHANGEPINWRONG
extern BOOL g_ChangePINWrong;
#endif
extern DWORD g_dwSimStatus;
extern ChangePINReg(DWORD dwPINState);
HRESULT ParseGetUserIdentity(LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
FUNCTION_TRACE(ParseGetUserIdentity);
LPSTR szUserID = NULL;
#ifdef RIL_WATSON_REPORT
char* szUserIDCache = g_RilInfoCache.szIMSI;
#endif // RIL_WATSON_REPORT
HRESULT hr = S_OK;
szUserID = (LPSTR)AllocBlob(MAXLENGTH_USERID);
if (!szUserID) {
hr = E_OUTOFMEMORY;
goto Error;
}
memset(szUserID, 0x00, MAXLENGTH_USERID);
//add by fengguisen for ISMI Cache
RETAILMSG(1,(TEXT("[TI] ParseGetUserIdentity:Begin..\r\n")));
if(!g_HasGetISMI)
{
g_szUserIdentityString = (LPSTR)AllocBlob(strlen(szRsp));
if (!g_szUserIdentityString)
{
hr = E_OUTOFMEMORY;
goto Error;
}
memcpy((void*)g_szUserIdentityString,szRsp,strlen(szRsp));
RETAILMSG(1,(TEXT("[TI] ParseGetUserIdentity:g_szUserIdentityString=%S..\r\n"),g_szUserIdentityString));
}
// Parse "<prefix><IMSI><postfix>"
if (!ParseRspPrefix(szRsp, szRsp) ||
!ParseUnquotedString(szRsp, '\r', szUserID, MAXLENGTH_USERID, szRsp) ||
!ParseRspPostfix(szRsp, szRsp)) {
hr = E_FAIL;
goto Error;
}
#ifdef RIL_WATSON_REPORT
// Copy IMSI to RIL Info Cache
strncpy(szUserIDCache, szUserID, MAXLENGTH_USERID);
#endif // RIL_WATSON_REPORT
#ifdef RIL_FIX_CMCC_NETWORK_ISSUE /*Added by liuhongjie 2006-03-17*/
char cMccMncID[6] = {0};
memcpy(cMccMncID,szUserID,5);
/*Save SIM MCC and MNC network ID*/
SetMCCMNCIdInSim( (DWORD)atoi(cMccMncID));
#endif
pBlob = (void*)szUserID;
cbBlob = MAXLENGTH_USERID;
g_HasGetISMI = TRUE;
RETAILMSG(1, (TEXT("[TI] ParseGetUserIdentity OK,g_HasGetISMI=%d,szUserID=%S\r\n"),g_HasGetISMI,szUserID));
Error:
if (FAILED(hr)) {
FreeBlob(szUserID);
}
return hr;
}
//
//
//
HRESULT RILDrv_GetUserIdentity(DWORD dwParam)
{
FUNCTION_TRACE(RILDrv_GetUserIdentity);
HRESULT hr = S_OK;
CRilInstanceHandle* pHandle = ExtractHandle(dwParam);
if (!pHandle) {
hr = E_FAIL;
goto Error;
}
if (!QueueCmd(pHandle, "AT+CIMI\r", CMDOPT_SUPPRESSLOGGING, APIID_GETUSERIDENTITY, ParseGetUserIdentity, NULL, hr)) {
hr = E_FAIL;
goto Error;
}
//add by fengguisen for Simultaneous voice and data call
//test for simultaneous data and voice connection
{
DWORD CallType = RIL_SYSTEMCAPS_VOICEDATA ;
CRilHandle * pRILHandle = pHandle->GetDevice();
if(pRILHandle && pRILHandle->BroadcastRealBlobNotification(RIL_NOTIFY_SYSTEMCAPSCHANGED, &CallType, sizeof(CallType)))
{
RETAILMSG(1, (TEXT("[TI] OK:broadcast simultaneous data and voice connections\r\n")));
}
else
{
RETAILMSG(1, (TEXT("[TI] ERROR:broadcast simultaneous data and voice connections\r\n")));
}
}
//end add
Error:
return hr;
}
//
//
//
HRESULT ParseGetPhoneLockedState(LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
FUNCTION_TRACE(ParseGetPhoneLockedState);
UINT i;
DWORD* pdwState = NULL;
char szState[MAX_PATH];
#ifdef RIL_WATSON_REPORT
char* szUserIDCache = g_RilInfoCache.szIMSI;
#endif // RIL_WATSON_REPORT
HRESULT hr = S_OK;
pBlob = NULL;
cbBlob = 0;
pdwState = (DWORD*)AllocBlob(sizeof(DWORD));
if (!pdwState) {
hr = E_OUTOFMEMORY;
goto Error;
}
memset(pdwState, 0x00, sizeof(DWORD));
// Parse "<prefix>+CPIN: <state><postfix>"
if (!ParseRspPrefix(szRsp, szRsp) ||
!MatchStringBeginning(szRsp, "+CPIN: ", szRsp) ||
!ParseUnquotedString(szRsp, '\r', szState, MAX_PATH, szRsp) ||
!ParseRspPostfix(szRsp, szRsp)) {
hr = E_FAIL;
goto Error;
}
for (i = 1; i <= NUM_LOCKEDSTATES; i++) {
if (!strcmp(szState, g_rgszLockedStates[i])) {
*pdwState = i;
/*
if (i > 1)
{
RETAILMSG(1, (TEXT("[TI][zhn PIN back] ParseGetPhoneLockedState(), return PIN.\r\n")));
if (gPINbackTimes == 1)
{
// let MS not popup pin check window
*pdwState = RIL_LOCKEDSTATE_UNKNOWN;
}
}
if (gPINbackTimes == 1)
{
g_pHandle->GetDevice()->BroadcastDWORDBlobNotification(RIL_NOTIFY_SPECSTARTCUSTPINCHECK, (DWORD) 2);
RETAILMSG(1, (TEXT("[TI][zhn broadcast] ParseGetPhoneLockedState(), return PIN.\r\n")));
}
*/
break;
}
}
RETAILMSG(1,(TEXT("[TI]ParseGetPhoneLockedState THE value of i is:%d \r\n"),i));
if (i > NUM_LOCKEDSTATES) {
// We couldn't match the response with anything
*pdwState = RIL_LOCKEDSTATE_UNKNOWN;
}
else
{
UpdateSIMState(*pdwState);
//add by qinxuetao for WM600021585
g_dwSimStatus = *pdwState;
#ifdef RIL_WATSON_REPORT
// Send command to update the IMSI in the info cache
// if the IMSI cache has not been updated yet and the
// SIM state is ready.
if (('\0' == *szUserIDCache) && (RIL_LOCKEDSTATE_READY == *pdwState) )
{
QueueCmdIgnoreRsp(APIID_NONE, "AT+CIMI\r", CMDOPT_SUPPRESSLOGGING | CMDOPT_IGNORERADIOOFF, g_TimeoutCmdInit, ParseGetUserIdentity, NULL, 0, 0, 0);
}
#endif // RIL_WATSON_REPORT
}
#ifdef CHANGEPINWRONG
if (RIL_LOCKEDSTATE_READY == i)
{
g_ChangePINWrong = FALSE;
RETAILMSG(1, (TEXT("[TI]Secur:set g_ChangePINWrong FALSE \r\n")));
}
if ((g_ChangePINWrong) && ((1 == i) || (2 == i)))
{
*pdwState = RIL_LOCKEDSTATE_READY;
i = RIL_LOCKEDSTATE_READY;
}
#endif
//DMDC:change PIN state for app and other module,only for 3 state
//note that regestry::--0: PIN ready; 1:PIN lock; 2:PUK block; 3:No SIM inserted
if((SIM_NEED_PIN == *pdwState) || (SIM_NEED_PUK == *pdwState) || (NO_SIM_INSERT== *pdwState))
{
ChangePINReg(*pdwState-1);
}
pBlob = (void*)pdwState;
cbBlob = sizeof(DWORD);
Error:
if (FAILED(hr)) {
FreeBlob(pdwState);
}
return hr;
}
//
//
//
HRESULT RILDrv_GetPhoneLockedState(DWORD dwParam)
{
FUNCTION_TRACE(RILDrv_GetPhoneLockedState);
HRESULT hr = S_OK;
CRilInstanceHandle* pHandle = ExtractHandle(dwParam);
if (!pHandle) {
hr = E_FAIL;
goto Error;
}
RETAILMSG(1, (TEXT("[TI]RILDrv_GetPhoneLockedState().\r\n")));
//gPINbackTimes++;
//g_pHandle = pHandle;
//end add
#ifdef WAVECOM_DRIVER
// HW-SPECIFIC: WaveCom hardware doesn't provide an OK at the end of an AT+CPIN? response
if (!QueueCmd(pHandle, "AT+CPIN?\r", CMDOPT_NONE, APIID_GETPHONELOCKEDSTATE, NULL, NULL, hr))
#else // WAVECOM_DRIVER
if (!QueueCmd(pHandle, "AT+CPIN?\r", CMDOPT_NONE, APIID_GETPHONELOCKEDSTATE, ParseGetPhoneLockedState, NULL, hr))
#endif // WAVECOM_DRIVER
{
hr = E_FAIL;
goto Error;
}
Error:
return hr;
}
//
//
//
HRESULT RILDrv_UnlockPhone(DWORD dwParam, LPCSTR lpszPassword, LPCSTR lpszNewPassword)
{
FUNCTION_TRACE(RILDrv_UnlockPhone);
DEBUGCHK(NULL != lpszPassword);
char szCmd[SECUR_CMDBUF_LENGTH];
LPSTR szWalk = szCmd;
HRESULT hr = S_OK;
CRilInstanceHandle* pHandle = ExtractHandle(dwParam);
if (!pHandle || !lpszPassword) {
hr = E_FAIL;
goto Error;
}
(void)_snprintfz(szWalk, SECUR_CMDBUF_LENGTH - (szWalk - szCmd), "AT+CPIN=\"%s\"", lpszPassword);
szWalk = strchr(szWalk, '\0'); // NO_TYPO: 27
DEBUGCHK(NULL != szWalk);
if (lpszNewPassword) {
(void)_snprintfz(szWalk, SECUR_CMDBUF_LENGTH - (szWalk - szCmd), ",\"%s\"", lpszNewPassword);
szWalk = strchr(szWalk, '\0'); // NO_TYPO: 27
DEBUGCHK(NULL != szWalk);
}
(void)strncpyz(szWalk, "\r", SECUR_CMDBUF_LENGTH - (szWalk - szCmd)); // NO_TYPO: 30
#ifdef RIL_RADIO_RESILIENCE
if ((RIL_LOCKEDSTATE_SIM_PIN == g_dwSimStatus) || (RIL_LOCKEDSTATE_SIM_PUK == g_dwSimStatus)
|| (RIL_LOCKEDSTATE_READY == g_dwSimStatus) || (RIL_LOCKEDSTATE_UNKNOWN == g_dwSimStatus))
{
// save the unlock code in case of radio reset
SavePINSecure(lpszNewPassword ? lpszNewPassword : lpszPassword);
}
#endif // RIL_RADIO_RESILIENCE
if (!QueueCmd(pHandle, szCmd, CMDOPT_UNLOCKING | CMDOPT_SUPPRESSLOGGING | CMDOPT_CPINENTERED, APIID_UNLOCKPHONE, NULL, NULL, hr,20000,0)) {
hr = E_FAIL;
goto Error;
}
Error:
return hr;
}
//
//
//
static HRESULT ParseGetLockingStatus(LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
FUNCTION_TRACE(ParseGetLockingStatus);
UINT nValue;
DWORD* pdwStatus = NULL;
HRESULT hr = S_OK;
pBlob = NULL;
cbBlob = 0;
pdwStatus = (DWORD*)AllocBlob(sizeof(DWORD));
if (!pdwStatus) {
hr = E_OUTOFMEMORY;
goto Error;
}
memset(pdwStatus, 0x00, sizeof(DWORD));
// Parse "<prefix>+CLCK: <status><postfix>"
if (!ParseRspPrefix(szRsp, szRsp) ||
!MatchStringBeginning(szRsp, "+CLCK: ", szRsp) ||
!ParseUIntAndVerifyAbove(szRsp, TRUE, 2, nValue, szRsp) ||
!ParseRspPostfix(szRsp, szRsp)) {
hr = E_FAIL;
goto Error;
}
*pdwStatus = (nValue ? RIL_LOCKINGSTATUS_ENABLED : RIL_LOCKINGSTATUS_DISABLED);
pBlob = (void*)pdwStatus;
cbBlob = sizeof(DWORD);
Error:
if (FAILED(hr)) {
FreeBlob(pdwStatus);
}
return hr;
}
//
//
//
HRESULT RILDrv_GetLockingStatus(DWORD dwParam, DWORD dwFacility, LPCSTR lpszPassword)
{
FUNCTION_TRACE(RILDrv_GetLockingStatus);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -