本章说明过滤钩子驱动程序. 一个过滤钩子驱动程序是用于操作系统中的一个IP过滤驱动程序的上下文中处理或过滤网络包,过滤钩子驱动程序扩展了IP过滤驱动程序的功能。下面主题描述了过滤钩子驱动程序的一些特性, 解释怎样建立过滤钩子并列出实现一个过滤钩子驱动程序相关的输入输出控制代码函数的参考信息: 1.1 关于过滤钩子驱动程序 一个过滤钩子驱动程序是一个用于过滤网络包的核心模式驱动程序. 一个过滤钩子驱动程序扩展系统提供的IP过滤驱动程序的功能。一个过滤钩子驱动程序仅仅只能安装于2000及其之后的系统上。仅仅只有一个过滤钩子驱动程序能被安装在系统之上并且被IP过滤驱动程序使用。如果一个过滤钩子驱动程序的指向用于IP过滤驱动程序的扩展钩子指针为空,那么他只能使用IP过滤驱动程序注册自己。一旦一个过滤钩子驱动程序使用了IP过滤驱动程序注册自己,IP过滤程序给这个IP过滤程序的扩展钩子分派文件对象,用这种方法,这个IP过滤驱动程序确保自己只能接受和使用单个的过滤钩子驱动程序.
1.2 建立一个过滤钩子驱动程序 一个过滤钩子驱动程序在包过滤API不能满足过滤网络包时候来建立。用户模式应用程序使用这些API来建立和管理系统在IP过滤驱动程序中提供的输出和输入过滤器。更多API信息查看SDK。 一个过滤钩子驱动程序是在核心模式驱动程序下开发的. 另外, 一个过滤钩子驱动程序完成一个过滤钩子回调函数并在系统提供的IP过滤驱动程序中注册这个回调函数. 这个回调函数被看作一个过滤钩子。这个IP过滤驱动程序以后使用这个过滤钩子以决定怎样处理到达和输出的包.
下面的章节将说明怎样建立一个过滤钩子驱动程序 1.2.1 建立过滤钩子 一个过滤钩子在执行一个PacketFilterExtensionPtr类型的函数时被建立。 当一个过滤钩子驱动程序在系统提供的IP过滤驱动程序中注册自己的过滤钩子实体指针时 ,这个过滤钩子驱动程序给他的过滤钩子提供符号地址. 因为一个过滤钩子驱动程序提供这个地址, 而不是名字,这个过滤钩子可以选择任何名字。当然,好的程序习惯是用其基本的功能来命名这个过滤钩子的名字。 一个过滤钩子对到达与发出的包进行特定的动作,他将与IP过滤驱动程序发送给过滤钩子来检查怎样的包将进一步处理的信息与到达的特定信息做比较。在过滤钩子检查包以后,他将使用PF_FORWARD, PF_DROP, 或PF_PASS返回响应代码给IP过滤驱动程序怎样处理的信息: PF_FORWARD 规定给IP过滤驱动程序马上返回转发响应给IP栈. 对于本地包, IP转发他们到栈顶. 如果包目标地址为外部机器并且路由允许, IP路由他们到对应的路由. PF_DROP 规定给IP过滤驱动程序马上返回drop响应给IP栈. IP将drop这个包. PF_PASS 规定给IP过滤驱动程序过滤这个包并且返回这个结果响应给IP栈. IP过滤驱动程序怎样处理这个过滤包决定于他怎样在Packet Filtering API中做的设置. 过滤钩子如果他检查到他不能处理的包但将允许IP过滤驱动程序过滤包的时候返回这个pass响应。
1.2.2 过滤钩子例子 本节显示了一个简单的过滤钩子基于某几个固定的包属性来构成forward和drop检查. 这个过滤钩子指定drop TCP包而forward其他协议的包. 注意:如果特定IP地址或TCP/UDP端口的包必须被过滤,考虑使用包过滤API替代建立一个用户模式的应用程序。这些API优化了系统提供的IP过滤驱动程序处理包而不需要在其上关联一个过滤钩子驱动程序. #define PROT_TCP 6 // Drop all TCP packets PF_FORWARD_ACTION DropTcpPackets( unsigned char *PacketHeader, unsigned char *Packet, unsigned int PacketLength, unsigned int RecvInterfaceIndex, unsigned int SendInterfaceIndex, IPAddr RecvLinkNextHop, IPAddr SendLinkNextHop ) { if (PacketHeader->iph_protocol == PROT_TCP) { return PF_DROP; } return PF_FORWARD; }