过滤钩子驱动程序参考
一个过滤钩子驱动程序提供自己的过滤钩子地址来注册过滤钩子实体指针给系统提供的IP过滤驱动程序. 这个
过滤钩子是一个由PacketFilterExtensionPtr定义的数据类型. 因为一个过滤钩子驱动程序提供这个地址而不是名字,
设备开发者完全任意的命名这个过滤钩子.
typedef PF_FORWARD_ACTION (*PacketFilterExtensionPtr)(
IN unsigned char *PacketHeader,
IN unsigned char *Packet,
IN unsigned int PacketLength,
IN unsigned int RecvInterfaceIndex,
IN unsigned int SendInterfaceIndex,
IN IPAddr RecvLinkNextHop,
IN IPAddr SendLinkNextHop
);
这个PacketFilterExtensionPtr数据类型指向一个过滤钩子回调函数. 这个函数处理发送给他的包并检查
是否转发或drop包或允许IP过滤驱动程序接着处理这个包.
参数:
PacketHeader:包的IP头的指针。过滤钩子能够计算IP头结构的报头指向的信息。
Packet :包含过滤钩子接收的包的信息的缓冲指针。这个缓冲不能包括用包头指向的IP头。
PacketLength :IP包字节长度信息,不包括IP头的长度。
RecvInterfaceIndex:包所到达的接口适配器的索引数目。过滤钩子使用这个索引来标识接受到包的接口
适配器的细节,对于发送的包,这个参数设置成INVALID_PF_IF_INDEX并且RecvLinkNextHop
的信息是无意义的。
SendInterfaceIndex:包所发送的接口适配器的索引数目。如果这个包将要路由的接口的信息是必须的。
过滤钩子能通过SNMP查询路由表. 对于到达的包,这个参数被设置成NVALID_PF_IF_INDEX并且
SendLinkNextHop中的信息是无意义的。
RecvLinkNextHop:如果接口适配器是一个指向多指针的接口,这个参数设置成收到包的接口适配器的IP地
址。其他时这个参数为设置成ZERO_PF_IP_ADDR.
SendLinkNextHop:如果接口适配器是一个指向多指针的接口,这个参数设置成发送包的接口适配器的IP地
址。其他时这个参数为设置成ZERO_PF_IP_ADDR.
返回值
从PF_FORWARD_ACTION列举中返回一个下面的值:
PF_FORWARD
PF_DROP
PF_PASS
IOCTL_PF_SET_EXTENSION_POINTER
过滤钩子驱动程序使用这个IOCTL来设置一个IRP用于过滤钩子驱动程序提交给IP过滤驱动程序. 过滤钩子
驱动程序在IoBuildDeviceIoControlRequest函数中发送这个IOCTL来设置IRP.
IOCTL_PF_SET_EXTENSION_POINTER注册过滤钩子回调函数给IP过滤驱动程序来通告IP过滤驱动程序对每个
要发送和接收到的IP包来调用这些过滤钩子回调. 同样, IOCTL_PF_SET_EXTENSION_POINTER从IP过滤驱动程序
清除过滤钩子回调函数.
参数
IoControlCode IOCTL_PF_SET_EXTENSION_POINTER.
DeviceObject:IP过滤驱动程序设备对象的指针.
InputBuffer:一个本地包含了PF_SET_EXTENSION_HOOK_INFO结构的指针。要注册过滤钩子回调函数,这
个结构保留过滤钩子回调函数的地址,要清除过滤钩子回调函数的,这个结构为NULL。
InputBufferLength PF_SET_EXTENSION_HOOK_INFO结构的字节长度
OutputBuffer :NULL
OutputBufferLength :Zero.
InternalDeviceIoControl :FALSE.
Event :NULL.
IoStatusBlock:一个本地接收一个I/O状态块的指针. 这个I/O状态块在IP过滤驱动程序完成I/O请求后设置.
注释
设置一个IRP, 过滤钩子驱动程序调用IoBuildDeviceIoControlRequest函数. 在这个调用中, 过滤钩子
驱动程序发送参数规定IOCTL_PF_SET_EXTENSION_POINTER的IOCTL请求; 这是个指向IP过滤驱动程序的设备对象
的指针; 和一个包含了PF_SET_EXTENSION_HOOK_INFO结构的输出缓冲. 要获得IP过滤驱动程序的设备对象, 过滤钩
子驱动程序调用IoGetDeviceObjectPointer函数. 在这个调用中, 过滤钩子驱动程序发送参数规定IP过滤驱动程序
的设备对象的名字, 和SYNCHRONIZE, GENERIC_READ, 和GENERIC_WRITE. 这些值规定了对这个设备的同步, 读, 和写
访问方式且必须被提供. 在IoGetDeviceObjectPointer调用中, 过滤钩子驱动程序同样发送一个缓冲指针以保存返回
的IP过滤驱动程序的文件或设备对象。这个Unicode字串包含的IP过滤驱动程序的设备对象的名字象\\Device\Ipfil-
terdriver格式.
提交这个IRP, 过滤钩子驱动程序调用IoCallDriver函数.
PF_SET_EXTENSION_HOOK_INFO结构定义如下.
PF_SET_EXTENSION_HOOK_INFO结构包含了一个过滤钩子回调函数的一些描述信息.
typedef struct _PF_SET_EXTENSION_HOOK_INFO {
PacketFilterExtensionPtr ExtensionPointer;
} PF_SET_EXTENSION_HOOK_INFO, *PPF_SET_EXTENSION_HOOK_INFO;
包含了如下成员的信息:
ExtensionPointer
规定一个PacketFilterExtensionPtr的数据类型以指向一个过滤钩子回调函数并在IP过滤驱动程序中登记这个函
数. 如果ExtensionPointer为空, 先前注册函数从IP过滤驱动程序被清除.