协议驱动程序缓冲区管理

协议驱动程序必须管理 NET_BUFFER_LIST 结构池,并 NET_BUFFER 发送操作的结构池。 若要创建这些池,驱动程序会调用以下函数:

NdisAllocateNetBufferListPool

NdisAllocateNetBufferPool

协议驱动程序可以使用以下函数从池中分配结构:

NdisAllocateNetBufferAndNetBufferList

NdisAllocateNetBufferList

NdisAllocateNetBuffer

调用 NdisAllocateNetBufferAndNetBufferList 比调用 NdisAllocateNetBufferListNdisAllocateNetBuffer 更高效。 但是, NdisAllocateNetBufferAndNetBufferList 仅在NET_BUFFER_LIST结构上创建一个NET_BUFFER结构。 若要使用 NdisAllocateNetBufferAndNetBufferList,驱动程序必须在调用 NdisAllocateNetBufferListPool 时将 AllocateNetBuffer 参数设置为 TRUE

协议驱动程序可以使用 OID 请求来查询基础驱动程序的回填和上下文空间要求。 协议驱动程序应确定处于 “打开” 或“ 正在重启” 状态的绑定的回填和上下文要求。 驱动程序应为整个堆栈分配足够的回填和上下文空间。 如有必要,协议驱动程序可以释放池并将其重新分配为 “正在重启” 状态。

协议驱动程序使用以下函数来释放池:

NdisFreeNetBufferListPool

NdisFreeNetBufferPool

协议驱动程序使用以下函数释放从池中分配的结构:

NdisFreeNetBufferList

NdisFreeNetBuffer

在释放关联的NET_BUFFER_LIST结构之前,驱动程序应释放使用 NdisAllocateNetBuffer 分配NET_BUFFER结构。 当驱动程序为关联的NET_BUFFER_LIST结构调用 NdisFreeNetBufferList 时,将释放使用 NdisAllocateNetBufferAndNetBufferList 分配的NET_BUFFER结构。