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章进行,此处就不再赘述。