13.2.3 支持大量数据包的转储
在使用pcap_live_dump函数设置内核转储文件的大小时,如果需要转储的数据包数量较大,则会出现溢出问题(比如,转储1000万个1514字节长度的数据包就会出现此情况)。pcap_live_dump函数原型中设置内核转储文件大小的参数类型为int,而pcap_live_dump函数是通过调用PacketSetDumpLimits函数来设置内核转储文件的大小,最终通过NPF的NPF_IoControl函数处理的BIOCSETDUMPLIMITS命令码来设置文件大小的。具体的函数原型如下:
int pcap_live_dump(pcap_tp,charflename,int maxsize,int maxpacks);
BOOLEAN PacketSetDumpLimits(LPADAPTER AdapterObject,
UINT maxflesize,UINT maxnpacks)
此处可对NPF_IoControl函数进行修改,如果pcap_live_dump函数设置maxsize参数为零,就只依据maxpacks(最多的数据报个数)来终止转储。具体代码的修改步骤如下:
步骤一:winpcap\packetNtx\driver\目录下的Packet.h文件中的第289行代码如下:
UINT MaxDumpBytes;
将上述代码修改为:
LARGE_INTEGER MaxDumpBytes;
步骤二:把内核驱动程序其他位置的Open->MaxDumpBytes修改为Open->MaxDumpBytes.QuadPart。
步骤三:修改winpcap\packetNtx\driver\目录下的Packet.c文件中的原1193行、1194行代码如下:
Open->MaxDumpBytes.QuadPart=
*(PULONG)Irp->AssociatedIrp.SystemBuffer;
//if语句内容为增加的内容
if(Open->MaxDumpBytes.QuadPart==0)
{//设置一个足够大的数值
Open->MaxDumpBytes.QuadPart=0xFFFFFFFFFFFFFFF;
}
Open->MaxDumpPacks=
*((PULONG)Irp->AssociatedIrp.SystemBuffer+1);
实际修改效果的测试将在第14章进行,此处就不再赘述。