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