WM手機開關GSM模塊的代碼(即飛行模式開關)

 http://bbs.pediy.com/showthread.php?t=87504

 

標 題: 【原創】發個WM手機開關GSM模塊的代碼(即飛行模式開關)
作 者: NETTF小金
時 間: 2009-04-30,11:52
鏈 接: http://bbs.pediy.com/showthread.php?t=87504

哎,真不知道怎麼一個兩個都把它藏着掖着,查了半天資料以及IDA逆了來電精靈和一個一鍵飛行工具才明白了其中的內幕。

成品界面看附件圖。

不多說了,用法是:
SetPhoneState(LINEEQUIPSTATE_MINIMUM); //開飛機
SetPhoneState(LINEEQUIPSTATE_FULL);   //安全着陸

------------------------------------------------------------------------------------

DWORD GetTSPLineDeviceID(const HLINEAPP hLineApp, const DWORD dwNumberDevices, const DWORD dwAPIVersionLow, const DWORD dwAPIVersionHigh, const TCHAR* const psTSPLineName)
{
DWORD dwReturn = 0xffffffff;
for(DWORD dwCurrentDevID = 0 ; dwCurrentDevID < dwNumberDevices ; dwCurrentDevID++)
{
   DWORD dwAPIVersion;
   LINEEXTENSIONID LineExtensionID;
   if(0 == lineNegotiateAPIVersion(hLineApp, dwCurrentDevID, 
    dwAPIVersionLow, dwAPIVersionHigh, 
    &dwAPIVersion, &LineExtensionID)) 
   {
    LINEDEVCAPS LineDevCaps;
    LineDevCaps.dwTotalSize = sizeof(LineDevCaps);
    if(0 == lineGetDevCaps(hLineApp, dwCurrentDevID, 
     dwAPIVersion, 0, &LineDevCaps)) 
    {
     BYTE* pLineDevCapsBytes = new BYTE[LineDevCaps.dwNeededSize];
     if(0 != pLineDevCapsBytes) 
     {
      LINEDEVCAPS* pLineDevCaps = (LINEDEVCAPS*)pLineDevCapsBytes;
      pLineDevCaps->dwTotalSize = LineDevCaps.dwNeededSize;
      if(0 == lineGetDevCaps(hLineApp, dwCurrentDevID, 
       dwAPIVersion, 0, pLineDevCaps)) 
      {
       if(0 == _tcscmp((TCHAR*)((BYTE*)pLineDevCaps+pLineDevCaps->dwLineNameOffset), 
        psTSPLineName)) 
       {
        dwReturn = dwCurrentDevID;
       }
      }
      delete[] pLineDevCapsBytes;
     }
    }
   }
}
return dwReturn;
}

DWORD SetPhoneState(DWORD state)
{
HLINEAPP m_hLineApp = 0;
DWORD m_dwAPIVersion = TAPI_API_HIGH_VERSION;
DWORD dwNumDevs;
LINEINITIALIZEEXPARAMS liep;
liep.dwTotalSize = sizeof(liep);
liep.dwOptions = LINEINITIALIZEEXOPTION_USEEVENT;
HLINE hLine = 0;
LONG lRC = 0;
DWORD dwState, dwRadioSupport;
TCHAR gszFriendlyAppName[160];

if(lineInitializeEx(&m_hLineApp, 0, 0, gszFriendlyAppName, &dwNumDevs, &m_dwAPIVersion, &liep)) {
   return PHONEDEVICE_ERROR;
}

if(NULL == m_hLineApp)
{
   return -1;
}

DWORD dwDeviceID = GetTSPLineDeviceID(m_hLineApp, dwNumDevs, TAPI_API_LOW_VERSION, TAPI_API_HIGH_VERSION, CELLTSP_LINENAME_STRING);

lRC = lineOpen( m_hLineApp, dwDeviceID, &hLine, m_dwAPIVersion, 0, 
   NULL, LINECALLPRIVILEGE_OWNER, LINEMEDIAMODE_DATAMODEM,
   NULL);

if(lRC < 0)
{
   if(hLine != NULL)
   {
    lineClose(hLine);
    hLine = NULL;
   }

   return lRC;
}

//lRC = lineGetEquipmentState(hLine, &dwState, &dwRadioSupport);

//if(lRC < 0)
//{
// lineClose(hLine);
// return lRC;
//}

//if((LINEEQUIPSTATE_MINIMUM == state) ||
// (LINEEQUIPSTATE_NOTXRX == state))
//{
// lRC = lineUnregister(hLine);

// if(lRC < 0)
// {
//   lineClose(hLine);
//   return lRC;
// }
//}

//if(dwState != state)
//{
   lRC = lineSetEquipmentState(hLine, state);
//}

if(lRC < 0)
{
   lineClose(hLine);
   return lRC;
}

if((LINEEQUIPSTATE_FULL == state) ||
   (LINEEQUIPSTATE_RXONLY == state) ||
   (LINEEQUIPSTATE_TXONLY == state))
{
   lRC = lineRegister(hLine, LINEREGMODE_AUTOMATIC, NULL, LINEOPFORMAT_NONE);

   if(lRC < 0)
   {
    lineClose(hLine);
    return lRC;
   }
}

lRC = lineClose(hLine);

return lRC;
}

 

 

 引用庫是CellCore.lib
-------------------------------------
#include <windows.h>
#include <commctrl.h>
#include <tapi.h>
#include <tsp.h>
#include <extapi.h>

#define TAPI_API_LOW_VERSION    0x00020000
#define TAPI_API_HIGH_VERSION    0x00020000
#define EXT_API_LOW_VERSION      0x00010000
#define EXT_API_HIGH_VERSION    0x00010000

#define PHONEDEVICE_ERROR      0x00000000
#define PHONEDEVICE_ERROR_SUCCESS    0x00000001
#define PHONEDEVICE_ERROR_LINEOPEN    0x00000002
#define PHONEDEVICE_ERROR_LINECLOSE    0x00000004
#define PHONEDEVICE_ERROR_GETSTATE    0x00000008
#define PHONEDEVICE_ERROR_SETSTATE    0x00000010
#define PHONEDEVICE_ERROR_UNREGISTER    0x00000020
#define PHONEDEVICE_ERROR_REGISTER    0x00000040

 

TAPI標準裏應該是先用lineUnregister註銷網絡然後再lineSetEquipmentState關閉GSM,但是註銷網絡這一步會導致程序停止響應一會兒(因爲lineUnregister要等待返回,除非用多線程去做),同時由於要註銷網絡,會稍慢一些,而國內其他飛行功能軟件都是跳過這一步直接關GSM的,大概現在的GSM通訊升級了吧,關閉前系統會自動通知基站電話關閉的,所以去掉了lineUnregister這步,達到迅速關閉GSM的目的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章