1.6.5 NPF_Close函数
当一个正在运行的驱动程序实例被用户调用CloseHandle()关闭时,该函数被调用(响应IRP_MJ_CLEANUP)。
函数主要代码如下:
NPF_Close(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
1.6.6 NPF_IoControl函数
函数执行IOCTL调用,当一个正在运行的驱动程序实例被用户调用DeviceIoControl时,该函数被调用(响应IRP_MJ_DEVICE_CONTROL)。函数原型如下:
NPF_IoControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
参数DeviceObject指向用户所使用的设备驱动对象。
参数Irp指向包含用户请求的IRP。
函数返回操作的状态。
一旦打开数据包捕获驱动程序,就能被用户层应用程序执行DeviceIoControl系统调用,通过IOCTL命令来进行配置。NPF_IoControl接收与服务所有直接传递给NPF的IOCTL调用。
与打开与关闭适配器相关的主要代码如下:
NTSTATUS NPF_IoControl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
…
/*#define BIOCSMINTOCOPY 7414
该IOCTL命令码用来设置内核缓冲区最小的数据量大小,数据量如果大于该大小,就解除一个读调用的锁定。该命令设置OPEN_INSTANCE::MinToCopy的成员大小。*/
case BIOCSMINTOCOPY:
/*
验证输入参数的合法性*/
if(IrpSp->Parameters.DeviceIoControl.InputBufferLength <
sizeof(ULONG))
{
SET_FAILURE_BUFFER_SMALL();
break;
}
Open->MinToCopy =
(*((PULONG)Irp->AssociatedIrp.SystemBuffer))/g_NCpu;
SET_RESULT_SUCCESS(0);
break;
/*#define BIOCISETLOBBEH 7410
该IOCTL命令码用来设置回环的行为,处理接收自己发送数据包的方式:捕获或丢弃。*/
case BIOCISETLOBBEH:
/*
验证输入参数的合法性*/
if (IrpSp->Parameters.DeviceIoControl.InputBufferLength <
sizeof(INT))
{
SET_FAILURE_BUFFER_SMALL();
break;
}
if(*(PINT)Irp->AssociatedIrp.SystemBuffer
== NPF_DISABLE_LOOPBACK)
{//
禁止回环
Open->SkipSentPackets = TRUE;
//
复位捕获缓冲区,因为可能含有回环数据包
NPF_ResetBufferContents(Open);
SET_RESULT_SUCCESS(0);
break;
}
else if(*(PINT)Irp->AssociatedIrp.SystemBuffer
== NPF_ENABLE_LOOPBACK)
{//
执行回环
Open->SkipSentPackets = FALSE;
SET_RESULT_SUCCESS(0);
break;
}
else
{//
不可知的操作
SET_FAILURE_INVALID_REQUEST();
break;
}
break;
---------------------------待续---------------------------