开发Windows 2000/XP下的防火墙
2006-07-20 11:40:33 来源:WEB开发网核心提示: 过滤函数我们已经知道了如何开发驱动并安装过滤函数,但还不知道该过滤函数中的任何东西,开发Windows 2000/XP下的防火墙(4),当主机接收或发送一个数据包,该过滤函数总会被调用,这对于进行NAT转换是非常有用的,你可以修改数据包的目标地址,系统会根据函数的返回值决定如何处理这个数据
过滤函数
我们已经知道了如何开发驱动并安装过滤函数,但还不知道该过滤函数中的任何东西。当主机接收或发送一个数据包,该过滤函数总会被调用,系统会根据函数的返回值决定如何处理这个数据包。
函数的原型是这样的:
typedef PF_FORWARD_ACTION
(*PacketFilterExtensionPtr)(
// Ip数据包的包头
IN unsigned char *PacketHeader,
// 不包括头的数据包
IN unsigned char *Packet,
// 包长度。不包括IP头的长度
IN unsigned int PacketLength,
// 接收数据的接口适配器编号
IN unsigned int RecvInterfaceIndex,
// 发送数据的接口适配器编号
IN unsigned int SendInterfaceIndex,
//接收数据包的适配器IP地址
IN IPAddr RecvLinkNextHop,
//发送数据包的适配器IP地址
IN IPAddr SendLinkNextHop
);
PF_FORWARD_ACTION 是枚举类型,可能的值有:
PF_FORWARD 指示IP filter Driver立即向IP栈传递数据。对于本地数据包,IP向上送入栈。如果目标是另外的机器并且允许路由,将通过IP路由发送。
PF_DROP 指示IP filter Driver丢弃IP包。
PF_PASS 指示IP filter Driver去过滤该数据包,IP filter Driver如果处理该数据包取决于包过滤API的设置。过滤钩子返回pass的回应,表明它没有处理该数据包而让IP filter Driver去过滤该数据包。
虽然DDK文档只包含了这三个值,如果你查看pfhook.h(Filter-Hook Driver需要的头文件)你可以发现还有一个PF_ICMP_ON_DROP,我猜这个值是用于对ICMP包进行丢弃。
在过滤函数的定义中,传递进来指向数据包头的指针。因此,你可以修改数据头然后发送。这对于进行NAT转换是非常有用的,你可以修改数据包的目标地址,选择IP路由。
更多精彩
赞助商链接