深度剖析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函數實現參數的查詢/設置功能。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章