適用平台
pocket pc 2002 phone edition
smartphone 2002
windows mobile 2003/se
windows mobile 5.0
windows mobile 6.0
開發工具
microsoft embedded visual c++ 3.0
microsoft embedded visual c++ 4.0
microsoft visual studio 2005
及適用於各平台的
sdk
摘要
通過本文可以知道如何使用
tapi
函式集去攔截指定的呼入**,知道為什麼使用
tapi
不能禁止呼出**以及禁止呼出**的其它辦法。
正文
呼入的攔截
想要對呼入**進行攔截,必須要讓監控程式攔截到呼叫資訊並加以分析,當發現符合攔截條件時結束通話**。使用
tapi
獲得呼叫資訊要經過如下步驟:初始化線路、確定
tapi
版本號、對指定線路進行監控、**呼入時獲得呼叫資訊並分析、符合條件結束通話**、釋放對線路的監控。
1. 初始化線路
為了使用tapi函式集,必須要包含tapi.h標頭檔案及cellcore.lib庫。
初始化線路的tapi函式為lineinitialize,原型如下:
hinstance是例項控制代碼
lpfncallback指向呼叫返回處理函式
lpdwnumdevs指向可供使用的線路裝置個數
lineinitialize完成對tapi的初始化後,所有的事件都是通過lpfncallback指向的**
函式傳遞給應用程式。**函式的原型為:
void far pascal linecallbackfunc(
dword hdevice,
dword dwmsg,
dword dwcallbackinstance,
dword dwparam1,
dword dwparam2,
dword dwparam3
);
hdevice 可以是乙個線路裝置的控制代碼,也可以是乙個與**相關的呼叫控制代碼,是哪種句
柄可以通過第二引數dwmsg提供的上下文關係得到。因為使用handle型別可能會引起乙個
錯誤,所以該引數必須是dword型別。
dwmsg 線路或呼叫訊息
dwcallbackinstance 傳回應用程式的**例項資料
dwparam1 訊息—具體的資料
dwparam2 訊息—具體的資料
dwparam3 訊息—具體的資料
2. 確定tapi版本號
使用linenegotiateapiversion函式把api使用版本通知給tapi,返回與tapi通訊所能使
用的版本,同時獲得線路裝置支援的擴充套件功能。
3. 對線路進行監控
使用lineopen函式開啟線路,並指出是對線路的語音監控。
下面的這個函式示例了以上3個步驟,具體**如下。(為了演示方便,並未加一些出錯
資訊處理,讀者可根據實際情況進行錯誤處理。下同。)
dword linehandlecount = 0;
hline* linehandles = null;
//**函式
void callback linecallback(dword hdevice, dword dwmsg, dword dwcallbackinstance,dword dwparam1,dword dwparam2, dword dwparam3)}}
}4. **呼入時獲得呼叫資訊並分析
跟蹤呼入**進入**函式的訊息,即dwmsg值,分別為:
②dwmsg = line_callstate 呼叫狀態
dwparam1 = linecallstate_offering 此時引起乙個響鈴
③dwmsg = line_callinfo 呼叫資訊
dwparam1 = linecallinfostate_origin 呼叫原始資訊
④dwmsg = line_callinfo 呼叫資訊
dwparam1 = linecallinfostate_callerid 呼叫標識
以上4個訊息是獲得呼叫資訊之前進入到**函式的。細心的讀者可能已經發現,在第二
個訊息那裡進行了響鈴,但這時呼叫資訊的訊息還沒有傳送到**函式,這也正說明了
市面一些來電防火牆在攔截之前總會振鈴的原因。
在第四個訊息處就可以獲得到呼入的號碼資訊,具體**如下:
void callback linecallback(dword hdevice, dword dwmsg, dword dwcallbackinstance, dword dwparam1, dword dwparam2, dword dwparam3)
tchar szphonenumber[30];
lstrcpy(szphonenumber,(lptstr)((lpstr)((dword)lpcallinfo+(dword)lpcallinfo->dwcalleridoffset)));
free(lpcallinfo);
//szphonenumber ---- 呼入的**號碼}}
}break;}}
5. 符合條件結束通話**
結束通話**只需乙個函式即可。
linedrop((hcall)hdevice,null,0);
6. 釋放對線路的監控
當不需要對**進行監控和攔截時,要關閉線路,**如下:
//釋放所有線路
void releaseline()
撥出的攔截
有一些讀者可能需要對撥出**進行限制,比如只允許撥上海市的號碼,而不允許撥其
他地區的號碼。經過作者的觀察,使用tapi攔截系統撥號程式撥出的號碼並結束通話是很睏
難的。下面是作者操作的過程,供讀者參考。
②dwmsg = line_callstate 呼叫狀態
dwparam1 = linecallstate_dialing 呼出
③dwmsg = line_callinfo 呼叫資訊
④dwmsg = line_callstate 呼叫狀態
dwparam1=linecallstate_proceeding 繼續
⑤dwmsg = line_callinfo 呼叫資訊
dwparam1=linecallinfostate_mediamode **模式
⑥dwmsg = line_callinfo 呼叫資訊
dwparam1=linecallinfostate_connectedid 連線標識
在⑥處可以得到撥出的**號碼,**如下:
linecallinfo *lpcallinfo;
lpcallinfo = (linecallinfo *)malloc(sizeof(linecallinfo)+1000);
memset(lpcallinfo, 0, sizeof(linecallinfo)+1000);
lpcallinfo->dwtotalsize = sizeof(linecallinfo)+1000;
while (1)
tchar szphonenumber[30];
lstrcpy(szphonenumber,(lptstr)((lpstr)((dword)lpcallinfo+(dword)lpcallinfo->dwconnectedidoffset)));
// szphonenumber ---- 撥出的**號碼
free(lpcallinfo);
在此處使用linedrop函式是不能結束通話**的,原因在於lineopen處的乙個引數
dwprivileges 。這是控制程式呼叫的許可權,此處只有如下幾種選擇:
linecallprivilege_none
只能呼出
linecallprivilege_monitor
只能監視呼入和撥出
linecallprivilege_owner
能控制指定的**型別(比如語音)呼入
linecallprivilege_monitor + linecallprivilege_owner
能控制指定的**型別(比如語音)呼入,但不是撥出的控制者,只是監視者
從上面可以看出,使用tapi沒有辦法結束通話其他撥號程式撥出的呼叫。
如果讀者確實有這方面的應用,不妨考慮一下更為底層的ril api。
結論本文講解了如何使用tapi進行**呼叫的攔截,其中可以攔截的為呼入**,不能攔截
的是撥出**。如果讀者想要攔截呼出**,不妨考慮使用ril api。
另外,讀者還要注意,在一些裝置上,tapi程式需要特權才能執行,如果讀者的裝置具
有這樣的特權,那麼請將tapi程式籤上相應的數字證書,或者降低裝置的安全等級。
iptables 防火牆使用
刪除原有規則 1.iptables f 2.iptables x 3.iptables t nat f 4.iptables t nat x 5.iptables p input drop 阻止所有網路入包 6.iptables a input i eth0 j accept 接受所有網路 7.ip...
防火牆使用技巧
防火牆容易受到攻擊嗎?現在介紹五種最佳實踐方法來減少黑客入侵電腦,讓您的電腦系統既流暢又安全。一 所有的防火牆檔案規則必須更改 儘管這種方法聽起來很容易,但是由於防火牆沒有內建的變動管理流程,因此檔案更改對於許多企業來說都不是最佳的實踐方法。如果防火牆管理員因為突發情況或者一些其他形式的業務中斷做出...
linux iptables 防火牆使用
centos 7.0 更改了預設的防火牆 使用了 firewalld 程序做為防火牆 開啟關閉方法 分別是 service firewalld start service firewlld stop 在7.0之前,預設的防火牆軟體是 iptables 如果不習慣的話,完成可以把 firewalld ...