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