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

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 函数实现参数的查询/设置功能。

 

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