筛选器驱动程序缓冲区管理

筛选器驱动程序创建缓冲区以复制从其他驱动程序获取的网络数据,或启动发送或接收操作。

如果筛选器驱动程序不创建缓冲区,则驱动程序不会管理缓冲池。 此类驱动程序只是传递它从其他驱动程序接收的缓冲区。

创建缓冲区以支持发送或接收操作的筛选器驱动程序必须管理 NET_BUFFER_LIST 结构池和 NET_BUFFER 结构池。

若要创建这些池,驱动程序会调用以下函数:

NdisAllocateNetBufferListPool

NdisAllocateNetBufferPool

筛选器驱动程序可以使用以下函数从池中分配结构:

NdisAllocateNetBufferAndNetBufferList

NdisAllocateNetBufferList

NdisAllocateNetBuffer

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

源自发送请求的筛选器驱动程序应确定基础驱动程序的上下文和回填空间要求。 筛选器驱动程序使用重启属性来确定基础驱动程序的回填要求。 筛选器驱动程序应确定处于 “正在重启” 状态的回填和上下文要求。 驱动程序应为整个堆栈分配足够的回填和上下文空间。 如有必要,筛选器驱动程序可以释放池并将其重新分配为 “正在重启” 状态。

筛选器驱动程序使用以下函数来释放池:

NdisFreeNetBufferListPool

NdisFreeNetBufferPool

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

NdisFreeNetBufferList

NdisFreeNetBuffer

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