?? ipfilter.cpp
字號:
// IpFilter.cpp: implementation of the CIpFilter class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "FirewallApp.h"
#include "IpFilter.h"
#include <stdlib.h>
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include "fltdefs.h"
#include "util.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CIpFilter::CIpFilter()
{
bCreateInterfaceSuccess = false;
ruleCount = 0;
/* 創(chuàng)建一個根據(jù)過濾規(guī)則丟棄數(shù)據(jù)包的過濾接口 */
DWORD retD = PfCreateInterface( 0, PF_ACTION_FORWARD, PF_ACTION_FORWARD,FALSE, TRUE, &drop );
///* 創(chuàng)建一個根據(jù)過濾規(guī)則放行數(shù)據(jù)包的過濾接口 */
//DWORD retD = PfCreateInterface( 0, PF_ACTION_DROP, PF_ACTION_DROP,FALSE, FALSE, &drop );
if(retD == NO_ERROR){
bCreateInterfaceSuccess = true;
}
in_addr ip = GetLocalIP();
localInAddr = ip.S_un.S_addr;
}
CIpFilter::~CIpFilter()
{
if(bCreateInterfaceSuccess){
PfDeleteInterface(drop);
}
}
/**
* 通過將過濾接口綁定到本地IP的方法使得過濾器發(fā)生作用
*
**/
bool CIpFilter::Filtering()
{
DWORD retD = PfBindInterfaceToIPAddress(drop,PF_IPV4,(PBYTE) & localInAddr);
return (retD == NO_ERROR);
}
/**
* 通過將過濾接口取消與本地IP的綁定的方法使得過濾器不再發(fā)生作用
*
**/
bool CIpFilter::UnFiltering()
{
DWORD retD = PfUnBindInterface(drop);
return (retD == NO_ERROR );
}
/**
* 向IP過濾器增加一條規(guī)則,先根據(jù)規(guī)則創(chuàng)建一個Filter描述子,
* 然后把Filter描述子加入到與IP過濾器相關的Interface即可
*
**/
bool CIpFilter::AddRule(RuleInfo rule)
{
PF_FILTER_DESCRIPTOR pf ;
/* 創(chuàng)建Filter描述子 */
pf.dwFilterFlags = FD_FLAGS_NOSYN;
int a = FD_FLAGS_NOSYN;
pf.dwRule = 0;
pf.pfatType = PF_IPV4;
pf.fLateBound = 0;
pf.dwProtocol = rule.protocol;
pf.wSrcPort = rule.sourcePort;
pf.wDstPort = rule.destinationPort;
pf.SrcAddr = (PBYTE) & rule.sourceIp;
pf.SrcMask = (PBYTE) & rule.sourceMask;
pf.DstAddr = (PBYTE) & rule.destinationIp;
pf.DstMask = (PBYTE) & rule.destinationMask;
pf.wSrcPortHighRange = pf.wSrcPort;
pf.wDstPortHighRange = pf.wDstPort;
DWORD ret;
/* 根據(jù)規(guī)則過濾數(shù)據(jù)包的方向來把Filter描述子加入到Inteface中 */
if(rule.bOut) ret = PfAddFiltersToInterface(drop,0,NULL,1,&pf,NULL);
else ret = PfAddFiltersToInterface(drop,1,&pf,0,NULL,NULL);
if(ret == NO_ERROR) ruleCount ++;
return ret == NO_ERROR;
}
/**
* 刪除與指定規(guī)則相關的Interface 中的Filter描述子
*
**/
bool CIpFilter::DeleteRule(RuleInfo rule)
{
PF_FILTER_DESCRIPTOR pf ;
/* 根據(jù)規(guī)則生成與該規(guī)則相應的Filter描述子*/
pf.dwFilterFlags = FD_FLAGS_NOSYN;
int a = FD_FLAGS_NOSYN;
pf.dwRule = 0;
pf.pfatType = PF_IPV4;
pf.fLateBound = 0;
pf.dwProtocol = rule.protocol;
pf.wSrcPort = rule.sourcePort;
pf.wDstPort = rule.destinationPort;
pf.SrcAddr = (PBYTE) & rule.sourceIp;
pf.SrcMask = (PBYTE) & rule.sourceMask;
pf.DstAddr = (PBYTE) & rule.destinationIp;
pf.DstMask = (PBYTE) & rule.destinationMask;
pf.wSrcPortHighRange = pf.wSrcPort;
pf.wDstPortHighRange = pf.wDstPort;
DWORD ret;
/* 根據(jù)規(guī)則過濾數(shù)據(jù)包的方向來刪除Interface中與它相關的Filter描述子 */
if(rule.bOut) ret = PfRemoveFiltersFromInterface(drop,0,NULL,1,&pf);
else ret = PfRemoveFiltersFromInterface(drop,1,&pf,0,NULL);
if(ret == NO_ERROR) ruleCount --;
return ret == NO_ERROR;
}
/**
* 通過釋放與過濾器相關的Interface,
* 再重新生成一個新的Interface,
* 最后把新Interface過濾器關聯(lián)起來,
* 從而實現(xiàn)了清除所有過濾規(guī)則的功能
*
**/
bool CIpFilter::ClearAllRules()
{
bool result = false;
DWORD retDD = PfDeleteInterface(drop);
DWORD retDC = PfCreateInterface( 0, PF_ACTION_DROP, PF_ACTION_DROP,FALSE, TRUE, &drop );
if(UnFiltering()
&& retDD == NO_ERROR
&& retDC == NO_ERROR){
result = true;
}
return result;
}
/**
* 通過Windows Socket來取得本地IP
*
**/
in_addr CIpFilter::GetLocalIP()
{
WORD wVersionRequested;
WSADATA wsaData;
hostent* localHost;
wVersionRequested = MAKEWORD( 2, 2 );
WSAStartup( wVersionRequested, &wsaData );
localHost = gethostbyname("");
WSACleanup();
in_addr* localIP = (struct in_addr *)localHost->h_addr_list[0];
return *localIP;
}
/**
* 調用API 取得與過濾器相關的Interface相關的狀態(tài)數(shù)據(jù)
*
**/
PF_INTERFACE_STATS * CIpFilter::GetState()
{
PF_INTERFACE_STATS * ret;
DWORD size = 0, retFlag = 0;
int x = sizeof(PF_INTERFACE_STATS);
ret = (PF_INTERFACE_STATS *)new char[sizeof(PF_INTERFACE_STATS)];
retFlag = PfGetInterfaceStatistics(drop,ret,&size,FALSE);
if(retFlag != NO_ERROR)
{
/*重復一定的調用次數(shù),以提供成功調用的概率*/
for(int i = 0; i < 10; i ++){
delete ret;
ret = (PF_INTERFACE_STATS *)new char[size];
retFlag = PfGetInterfaceStatistics(drop,ret,&size,FALSE);
if(retFlag == NO_ERROR) break;
}
if(retFlag != NO_ERROR) return NULL;
}
return ret;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -