NET_BUFFER_LIST 代系之间的关系

驱动程序编写者应了解和维护父 (原始) NET_BUFFER_LIST 结构与子 (派生) 结构之间的关系,这些结构由克隆、碎片和重新汇编操作生成。

clone/fragment/reassemble 函数的调用方维护父/子关系,包括子NET_BUFFER_LIST结构和子计数中的父指针。 子计数可确保调用方在释放所有子级后释放父级。 下列规则适用:

  • 驱动程序从 NET_BUFFER_LIST 结构创建子结构后,应保留父结构的所有权,并将子结构传递给其他驱动程序。 驱动程序绝不应将父NET_BUFFER_LIST结构传递给另一个驱动程序。

  • 驱动程序应仅更新父NET_BUFFER_LIST结构中的子计数。 由于父结构永远不会传递给另一个驱动程序,因此不存在子计数值被覆盖的风险。 驱动程序应将子结构中的父指针设置为指向父结构。

  • 当驱动程序从另一个驱动程序接收NET_BUFFER_LIST时,驱动程序不得覆盖父指针。 如果收到的NET_BUFFER_LIST结构是子级,则应已设置其父指针。 驱动程序可以使用从另一个驱动程序收到的NET_BUFFER_LIST作为父结构。

  • NDIS 不强制执行上述规则。 NET_BUFFER_LIST结构的当前所有者必须管理子计数和父指针。 例如,如果当前所有者同时克隆和分段NET_BUFFER_LIST结构,则必须管理父指针和子计数器。

  • NDIS 在分配NET_BUFFER_LIST结构时,将子计数设置为零,父指针设置为 NULL 。 每次驱动程序将NET_BUFFER_LIST结构传递给另一个驱动程序时,NDIS 都不会更改这些字段。

派生的 NET_BUFFER_LIST 结构