使用TAPI開發電話防火牆程式

2021-04-22 04:09:40 字數 4606 閱讀 7400

適用平台

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 ...