9.4.2 Packet.dll库对应的函数
下面介绍PacketSetBpf函数,该函数用于设置一个内核级的数据包过滤器,其原型如下:
BOOLEAN PacketSetBpf(LPADAPTER AdapterObject,
struct bpf_program*fp)
上述函数中,参数AdapterObject指向一个_ADAPTER结构体。
参数fp指向一个过滤器的指令数组。该过滤器将与数据包捕获或监视实例相关联,并对每个进来的数据包执行过滤操作。如果过滤器设置成功,函数返回TRUE。如果有错误出现或过滤指令没有通过驱动程序的安全检查,则函数执行失败,将返回FALSE。
驱动程序执行安全检查是为了避免系统崩溃,防止出现有缺陷的或恶意的过滤器,并且拒绝不符合要求的过滤器。
PacketSetBpf函数的主要实现代码如下:
BOOLEAN PacketSetBpf(LPADAPTER AdapterObject,
struct bpf_program*fp)
{
DWORD BytesReturned;
BOOLEAN Result;
……
if(AdapterObject->Flags==INFO_FLAG_NDIS_ADAPTER)
{
Result=(BOOLEAN)DeviceIoControl(
AdapterObject->hFile,
BIOCSETF,//设置过滤器的命令码
(char*)fp->bf_insns,//指令数组地址
fp->bf_len*sizeof(struct bpf_insn),//指令数组长度
NULL,
0,
&BytesReturned,
NULL);
}
else
{
//错误,在一个不知类型的设备类型上请求设置BPF过滤器
Result=FALSE;
}
return Result;
}
该函数主要调用DeviceIoControl系统函数,使用BIOCSETF命令码,并最终调用内核空间驱动程序的NPF_IoControl函数,来把过滤器设置到内核空间上。此函数会把一个新的BPF过滤器关联到适配器AdapterObject上。