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上。