12.5.3 驱动程序中对应的函数

目前版本的WinPcap(WpcapSrc_4_1_2.zip)并不支持内核转储,所以在内核驱动程序NPF中并没有对内核转储的具体支持代码进行激活。为了后续的理解,下面介绍几个相关的IO命令码的作用。

NPF_IoControl函数中的相关代码如下:


NTSTATUS NPF_IoControl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)

{

……

/*

*#defne BIOCSMODE 7412

*设置工作模式

*

*可以设置为数据包捕获模式(MODE_CAPT,默认的模式)、

*统计模式(MODE_STAT)、内核转储模式(MODE_DUMP)

*与内核转储与统计模式(MODE_STAT|MODE_DUMP)。

*/

case BIOCSMODE:

if(IrpSp->Parameters.DeviceIoControl.InputBufferLength<sizeof(ULONG))

{

SET_FAILURE_BUFFER_SMALL();

break;

}

mode=*((PULONG)Irp->AssociatedIrp.SystemBuffer);

/此时还不支持内核转储,对该模式的设置将返回失败/

if(mode&MODE_DUMP)

{

SET_FAILURE_INVALID_REQUEST();

break;

}

……

break;

/*

*#defne BIOCSETDUMPFILENAME 9029

*设置内核转储所需文件的名称

*

*转储线程用来把内核环形缓冲区的数据存储到该文件中。

*如果一个转储文件已经存在,将关闭它,并打开新的文件进行转储

*/

case BIOCSETDUMPFILENAME:

//此时还不支持内核转储,该设置将返回失败

SET_FAILURE_INVALID_REQUEST();

break;

/*

*#defne BIOCSETDUMPLIMITS 9034

*设置转出文件的限制

*

*设置转储文件能够存储的最大字节数与最大数据包个数

*/

case BIOCSETDUMPLIMITS:

//此时还不支持内核转储,该设置将返回失败

SET_FAILURE_INVALID_REQUEST();

break;

/*

*#defne BIOCISDUMPENDED 7411

*获取内核转储过程的状态

*

*如果内核转储结束(通过BIOCSETDUMPLIMITS设置的任一限制达到),返回TRUE

*/

case BIOCISDUMPENDED:

//此时还不支持内核转储,该设置将返回失败

SET_FAILURE_INVALID_REQUEST();

break;

……

}


在NPF_tap函数中处理内核转储的相关代码如下:


……

if(Open->mode&MODE_DUMP&&Open->MaxDumpPacks)

{

ULONG Accepted=0;

/计算所接收的数据包个数/

for(i=0;i<g_NCpu;i++)

Accepted+=Open->CpuData[i].Accepted;

/达到了内核转储的最大数据包个数,丢弃该数据包并停止转储线程/

if(Accepted>Open->MaxDumpPacks)

{

Open->DumpLimitReached=TRUE;//停止转储线程

//唤醒转储线程

NdisSetEvent(&Open->DumpEvent);

//唤醒应用程序

if(Open->ReadEvent!=NULL)

KeSetEvent(Open->ReadEvent,0,FALSE);

//函数返回

return NDIS_STATUS_NOT_ACCEPTED;

}

}

……