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

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

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

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

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

NdisAllocateNetBufferListPool

NdisAllocateNetBufferPool

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

NdisAllocateNetBufferAndNetBufferList

NdisAllocateNetBufferList

NdisAllocateNetBuffer

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

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

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

NdisFreeNetBufferListPool

NdisFreeNetBufferPool

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

NdisFreeNetBufferList

NdisFreeNetBuffer

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