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

本文详细介绍了PacketSetReadEvt函数如何分配读事件信号并传递给内核驱动程序,以及PacketSetMaxLookaheadsize函数如何设置最大前视缓冲区的过程。

本文转自http://eslxf.blog.51cto.com/918801/208597

 

1.5.2.1.1.2  PacketSetReadEvt函数
函数PacketSetReadEvt分配与捕获实例相关联的读事件信号,并把它传递给内核驱动程序,并存储在一个_ADAPTER结构体中。函数原型如下:
BOOLEAN PacketSetReadEvt(LPADAPTER AdapterObject);
参数AdapterObject指向一个适配器。
如果函数成功,返回非0值,
 
BOOLEAN PacketSetReadEvt(LPADAPTER AdapterObject)
{
    DWORD BytesReturned;
    HANDLE hEvent;
 
    if (AdapterObject->ReadEvent != NULL)
    {
        SetLastError(ERROR_INVALID_FUNCTION);
        return FALSE;
    }
 
    /*创建读事件信号*/
    hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
 
    if (hEvent == NULL)
    {
        //创建失败,函数返回
        return FALSE;
    }
 
    /*传递给内核驱动*/
    if(DeviceIoControl(AdapterObject->hFile,
            BIOCSETEVENTHANDLE,
            &hEvent,
            sizeof(hEvent),
            NULL,
            0,
            &BytesReturned,
            NULL)==FALSE)
    {//失败,函数返回
        …
        return FALSE;
    }
 
/*赋给AdapterObject->ReadEvent*/
    AdapterObject->ReadEvent = hEvent;
 
/*timeout设置为0,无超时*/
    AdapterObject->ReadTimeOut=0;
 
    return TRUE;
}
函数PacketOpenAdapter调用该函数,用来分配读事件信号,并把它通过ioctl调用传递给驱动程序,赋给AdapterObject所指的_ADAPTER结构。
函数最后由NPF驱动程序的NPF_IoControl函数的case BIOCSETEVENTHANDLE分支语句在底层实现。
 
1.5.2.1.1.3  PacketSetMaxLookaheadsize函数
函数PacketSetMaxLookaheadsize给驱动程序的Packet_tap函数设置尽可能最大的前视缓冲区。参数AdapterObject是指向ADAPTER对象的一个指针。如果函数成功返回非0值。
主要代码如下:
BOOLEAN PacketSetMaxLookaheadsize (LPADAPTER AdapterObject)
{
    BOOLEAN    Status;
    ULONG      IoCtlBufferLength=(sizeof(PACKET_OID_DATA)+sizeof(ULONG)-1);
    PPACKET_OID_DATA  OidData;
 
OidData = GlobalAllocPtr(GMEM_MOVEABLE | GMEM_ZEROINIT,
IoCtlBufferLength);
    if (OidData == NULL) {
        // 内存分配失败
        Status = FALSE;
    }
    else
    {
        //设置 前视缓冲区大小为NIC驱动程序能提供的最大可用值
        OidData->Oid=OID_GEN_MAXIMUM_LOOKAHEAD;
        OidData->Length=sizeof(ULONG);
        Status=PacketRequest(AdapterObject,FALSE,OidData);
// 查看当前视缓冲区的大小
        OidData->Oid=OID_GEN_CURRENT_LOOKAHEAD;
        Status=PacketRequest(AdapterObject,TRUE,OidData);
        GlobalFreePtr(OidData);
    }
 
    return Status;
}
函数主要调用 PacketRequest函数实现参数的查询/设置功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值