#include #include #include "itsutils.h" #include "ptrutils.h" #include "GsmDevice.h" //------------------------------------------------------------------------------------ #define GSM_READ_BLOCK_SIZE 100 bool ReadGsmMemory(DWORD dwStart, BYTE *buf, DWORD dwLength, DWORD *pdwCopied) { DWORD nCopied= 0; DWORD addr= dwStart; GsmDevice gsm; gsm.open(); gsm.DisableRIL(); while (nCopied < dwLength) { DWORD nChunkSize= std::min(GSM_READ_BLOCK_SIZE -(addr%GSM_READ_BLOCK_SIZE), dwLength-nCopied); if (!gsm.ReadBlock(&buf[nCopied], addr, nChunkSize)) return false; nCopied += nChunkSize; addr += nChunkSize; } *pdwCopied= nCopied; return true; } #define GSM_WRITE_BLOCK_SIZE 4 bool WriteGsmMemory(DWORD dwStart, BYTE *buf, DWORD dwLength, DWORD *pdwCopied) { DWORD nCopied= 0; DWORD addr= dwStart; GsmDevice gsm; gsm.open(); while (nCopied < dwLength) { DWORD nChunkSize= std::min(GSM_WRITE_BLOCK_SIZE -(addr%GSM_WRITE_BLOCK_SIZE), dwLength-nCopied); if (!gsm.WriteBlock(addr, &buf[nCopied], nChunkSize)) return false; nCopied += nChunkSize; addr += nChunkSize; } *pdwCopied= nCopied; return true; } ITSUTILS_API HRESULT STDAPICALLTYPE ITReadGsmMemory( DWORD cbInput, ReadGsmMemoryParams *pbInput, DWORD *pcbOutput, ReadGsmMemoryResult **ppbOutput, IRAPIStream *pStream) { ReadGsmMemoryResult *pOut=NULL; *pcbOutput= PTR_DIFF(pOut, pOut->buffer+pbInput->nSize); pOut= *ppbOutput= (ReadGsmMemoryResult*)LocalAlloc(LPTR, *pcbOutput); DWORD res= 0; if (!ReadGsmMemory(pbInput->dwOffset, &pOut->buffer[0], pbInput->nSize, &pOut->dwNumberOfBytesRead)) res= GetLastError(); return res; } ITSUTILS_API HRESULT STDAPICALLTYPE ITWriteGsmMemory( DWORD cbInput, WriteGsmMemoryParams *pbInput, DWORD *pcbOutput, WriteGsmMemoryResult **ppbOutput, IRAPIStream *pStream) { *pcbOutput= sizeof(WriteGsmMemoryResult); WriteGsmMemoryResult *pOut= *ppbOutput= (WriteGsmMemoryResult*)LocalAlloc(LPTR, *pcbOutput); DWORD res= 0; if (!WriteGsmMemory(pbInput->dwOffset, &pbInput->buffer[0], pbInput->nSize, &pOut->dwNumberOfBytesWritten)) res= GetLastError(); return res; } void GsmReset() { GsmDevice gsm; gsm.open(); gsm.DisableRIL(); gsm.Reset(); } void GsmStopRil() { GsmDevice gsm; gsm.open(); gsm.DisableRIL(); gsm.close(); } void GsmStartRil() { GsmDevice gsm; gsm.open(); gsm.EnableRIL(); gsm.close(); } ITSUTILS_API HRESULT STDAPICALLTYPE ITGsmControl( DWORD cbInput, GsmControlParams *pbInput, DWORD *pcbOutput, GsmControlResult **ppbOutput, IRAPIStream *pStream) { *pcbOutput= 0; *ppbOutput= NULL; switch(pbInput->nCmd) { case GSM_RESET: GsmReset(); break; case GSM_STOPRIL: GsmStopRil(); break; case GSM_STARTRIL: GsmStartRil(); break; } return 0; }