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