#include "stdafx.h"
#include "xpktfilter.h"
#include "xpktfilterDlg.h"
#include "./xpktfilterdlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#pragma comment(lib,"iphlpapi.lib")
// CxpktfilterDlg 對話方塊
CxpktfilterDlg::CxpktfilterDlg(CWnd* pParent /*=NULL*/)
: CDialog(CxpktfilterDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CxpktfilterDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CxpktfilterDlg, CDialog)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDOK, OnBnClickedOk)
ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
END_MESSAGE_MAP()
// CxpktfilterDlg 訊息處理常式
BOOL CxpktfilterDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 設定此對話方塊的表徵圖。當應用程式主視窗不是對話方塊時,架構將自動
// 執行此操作
SetIcon(m_hIcon, TRUE); // 設定大表徵圖
SetIcon(m_hIcon, FALSE); // 設定小表徵圖
ShowWindow(SW_MINIMIZE);
// TODO: 在此添加額外的初始化代碼
return TRUE; // 除非設定了控制項的焦點,否則返回 TRUE
}
// 如果向對話方塊添加最小化按鈕,則需要下面的代碼
// 來繪製該表徵圖。對於使用文檔/視圖模型的 MFC 應用程式,
// 這將由架構自動完成。
void CxpktfilterDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用於繪製的裝置上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使表徵圖在工作矩形中置中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 繪製表徵圖
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
//當使用者拖動已最小化的視窗時系統調用此函數取得游標顯示。
HCURSOR CxpktfilterDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CxpktfilterDlg::OnBnClickedOk()
{
PfCreateInterface(0,
PF_ACTION_DROP,//PF_ACTION_FORWARD,
PF_ACTION_DROP,//PF_ACTION_FORWARD,
FALSE,
TRUE,
&hInterface);
// 綁定需要網路包過濾的IP地址
BYTE localIp[]={127,0,0,1};
/********************************************************************
這裡可以用代碼實現自動獲得本機IP,由於時間關係,留下這個問題給讀者自己研究,
不便之處請原諒。
*********************************************************************/
PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);
// 現在我們開始過濾HTTP協議的的介面
// 填充過濾包的規則結構
PF_FILTER_DESCRIPTOR inFilter;
inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添這個值
inFilter.dwRule = 0; //一直添這個值
inFilter.pfatType = PF_IPV4; //用 ipV4 地址
inFilter.SrcAddr = localIp; //設定本地IP地址
inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意來源連接埠
inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;
inFilter.DstAddr = 0; //任意目標地址
inFilter.DstMask = 0;
inFilter.wDstPort = FILTER_TCPUDP_PORT_ANY; //任意目標連接埠
inFilter.wDstPortHighRange =FILTER_TCPUDP_PORT_ANY;
inFilter.dwProtocol = FILTER_PROTO_TCP; // 過濾的協議,可選FILTER_PROTO_ICMP
// 加入一個過濾介面
PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);
}
void CxpktfilterDlg::OnBnClickedButton1()
{
PfRemoveFilterHandles(hInterface, 1, &fHandle);
PfUnBindInterface(hInterface);
PfDeleteInterface(hInterface);
}