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;
}
}
……