12.5 内核文件转储的实现

内核文件转储的主要函数调用关系如图12-10所示。

12.5 内核文件转储的实现 - 图1

图 12-10 内核文件转储的主要函数调用关系

注意 目前版本的WinPcap并不支持内核转储,所以在内核驱动程序NPF中并没有对内核转储的具体支持代码进行激活。为了后续章节内容的理解,下面介绍几个相关函数的作用与实现进行。

12.5.1 wpcap.dll库中相应函数的实现

1.pcap_live_dump函数

pcap_live_dump函数用于将捕获的数据包直接保存到内核文件中,其原型如下:


int pcap_live_dump(pcap_tp,charflename,int maxsize,int maxpacks);


上述函数中,参数filename为文件名;参数maxsize为文件可以允许存储的最大字节数;参数maxpacks为文件可以允许存储的最大数据包个数,0表示没有限制。

如果pcap_live_dump函数执行成功则返回0;否则返回-1。

该函数的具体实现代码如下:


int pcap_live_dump(pcap_tp,charflename,int maxsize,int maxpacks)

{

if(p->adapter==NULL)

{

sprintf(p->errbuf,"live dump needs a physical

interface supported by the NPF driver");

return-1;

}

/设置驱动程序为内核转储模式/

res=PacketSetMode(p->adapter,PACKET_MODE_DUMP);

if(res==FALSE){

sprintf(p->errbuf,"Error setting dump mode");

return-1;

}

/设置内核转储文件名称/

res=PacketSetDumpName(p->adapter,flename,strlen(flename));

if(res==FALSE){

sprintf(p->errbuf,"Error setting kernel dump fle name");

return-1;

}

/设置内核转储文件限制/

res=PacketSetDumpLimits(p->adapter,maxsize,maxpacks);

return 0;

}


在调用pcap_live_dump函数将数据包保存下来之前,程序可以设置过滤器,这样就可以保存特定的数据包了。

内核转储处理以异步的方式进行,直到文件达到maxsize字节数或maxpacks个数据包时,转储才会停止。因此,pcap_live_dump函数不会被阻塞,在开始内核转储后它会立即返回。

注意,当两个限制(maxsize与maxpacks)中的任何一个达到后,转储被停止,但是文件仍然打开着。为了正确地将缓冲区的数据写入文件中,并把文件设置为一致的状态,必须用pcap_close函数将适配器关闭。

应用程序可以使用pcap_live_dump_ended函数来检查数据包是否存储完毕。

pcap_live_dump函数和pcap_dump函数的区别,除了pcap_live_dump函数可以设置限制之外,就是两者运行结果不同。pcap_live_dump函数利用WinPcap的NPF驱动自带的功能,在内核空间存储文件,这样可将上下文交换的数量和内存复制的数量最小化。显然,这个特性目前并不能应用于其他操作系统(如Linux),因为pcap_live_dump函数是WinPcap的特性之一,并且只运行于Win32平台下。

2.pcap_live_dump_ended函数

pcap_live_dump_ended函数用于返回内核转储处理的状态,也就是告诉我们由pcap_live_dump函数设置的限制条件是否已经满足。

该函数的sync参数必须为非0值,否则程序将永远被阻塞(NPF真正支持内核转储时才是这样的)。

如果返回值为非0,则表示两个限制中的一个已达到,并且转储过程已停止。

下面为该函数的具体实现代码:


int pcap_live_dump_ended(pcap_t*p,int sync)

{

if(p->adapter==NULL)

{

sprintf(p->errbuf,"wrong interface type.

A physical interface supported by the NPF driver is needed");

return-1;

}

return PacketIsDumpEnded(p->adapter,(BOOLEAN)sync);

}


注意,如果转储过程没有限制(也就是pcap_live_dump函数的maxsize与maxpacks两个参数都为0),转储的过程将不会停止,因此设置sync为TRUE将会永远阻塞调用该函数的应用程序。