深度剖析WinPcap之(八)――打开与关闭适配器(25)

1.6.5    NPF_Close函数

当一个正在运行的驱动程序实例被用户调用CloseHandle()关闭时,该函数被调用(响应IRP_MJ_CLEANUP)。
函数主要代码如下:
NTSTATUS
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)。函数原型如下:
NTSTATUS
NPF_IoControl(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
);
参数DeviceObject指向用户所使用的设备驱动对象。 参数Irp指向包含用户请求的IRP
函数返回操作的状态。
一旦打开数据包捕获驱动程序,就能被用户层应用程序执行DeviceIoControl系统调用,通过IOCTL命令来进行配置。NPF_IoControl接收与服务所有直接传递给NPFIOCTL调用。
与打开与关闭适配器相关的主要代码如下:
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;
 
---------------------------待续---------------------------

你可能感兴趣的:(职场,休闲,winpcap)