1.5.2.1.7 PacketSetMinToCopy函数
函数PacketSetMinToCopy定义最少字节数,对适配器执行一次读操作时,内核缓冲区中数据要求达该字节数后,读操作才可返回。函数原型如下:
BOOLEAN PacketSetMinToCopy(LPADAPTER AdapterObject,int nbytes);
参数AdapterObject是一个指向一个_ADAPTER结构体的指针。参数nbytes是,对该适配器执行一次读操作时,内核缓冲区中数据要求达到该最少字节数后,读操作才可返回。
如果函数成功,返回非0值。
如果是一个很大的值,内核接收几个数据包后才把数据复制到用户层。这保证少量的系统调用,也就是,低的处理器占用与更好的性能,该方式对嗅探器是一个不错的设置。
相反的,一个小的值意味着内核只要一接收到数据包,就尽可能快的把数据包复制给准备接收它的应用程序。建议需要内核具有更好响应的实时应用程序(比如一个网桥) 采用该方式。
函数主要调用下列语句实现:
Result = (BOOLEAN)DeviceIoControl(AdapterObject->hFile,
BIOCSMINTOCOPY,&nbytes,4,NULL,0,&BytesReturned,NULL);
最后由NPF驱动程序的NPF_IoControl函数的case BIOCSMINTOCOPY: 分支语句在底层实现。
1.5.2.1.8 PacketSetReadTimeout函数
函数PacketSetReadTimeout设置一个适配器上读操作的超时时间。函数原型如下:
BOOLEAN PacketSetReadTimeout(LPADAPTER AdapterObject,int timeout);
参数AdapterObject指向一个_ADAPTER结构体,参数timeout为超时时间,以毫秒为单位,在AdapterObject适配器上调用PacketReceivePacket函数后,如果在timeout时间内没有数据包到达,将放弃该调用。
把timeout设置为0意味着无超时,也就是说如果没有数据包到达PacketReceivePacket从不返回。Timeout为-1,导致PacketReceivePacket总是立即返回。
如果函数成功,返回非0值,
注意:在适配器工作于统计模式下,该函数可用来设置两个统计报告之间的时间间隔。
函数的主要代码如下:
BOOLEAN PacketSetReadTimeout(LPADAPTER AdapterObject,int timeout)
{
BOOLEAN Result;
AdapterObject->ReadTimeOut = timeout;
…
if(AdapterObject->Flags == INFO_FLAG_NDIS_ADAPTER)
{
Result = TRUE;
}
else
{//一个未知类型的适配器请求设置超时时间
Result = FALSE;
}
return Result;
}
本文出自 “千江月” 博客,请务必保留此出处http://eslxf.blog.51cto.com/918801/209123
转载于:https://blog.51cto.com/runhook/387710