分段的 NET_BUFFER_LIST 结构

NDIS 驱动程序可以从现有的 NET_BUFFER_LIST 结构创建分段NET_BUFFER_LIST结构。 分段结构引用一组引用原始数据的 NET_BUFFER 结构;但是,数据划分为不超过最大大小的单位。 驱动程序可以使用这种类型的结构有效地将大型缓冲区分解为较小的缓冲区。

下图显示了父NET_BUFFER_LIST结构和分段子级之间的关系。

显示父NET_BUFFER_LIST结构与其分段子结构之间的关系的关系图。

上图包含父 NET_BUFFER_LIST 结构和派生自该父级的子结构。 父结构具有一个 NET_BUFFER_LIST_CONTEXT 结构和一个附加了 MDL 的NET_BUFFER 结构。 父结构的父指针为 NULL ,指示它不是派生结构。

子NET_BUFFER_LIST结构具有三个附加了 MDL 的NET_BUFFER结构。 子NET_BUFFER_LIST结构具有指向父结构的指针。 NET_BUFFER_LIST_CONTEXT 结构指针所在的 NULL 指示子级没有NET_BUFFER_LIST_CONTEXT结构。

NDIS 驱动程序调用 NdisAllocateFragmentNetBufferList 函数,以创建基于现有 NET_BUFFER_LIST 结构中的数据的新分段NET_BUFFER_LIST结构。 NDIS 为分段 NET_BUFFER_LIST 结构分配新的NET_BUFFER结构和 MDL。 NDIS 不会为分段结构分配 NET_BUFFER_LIST_CONTEXT 结构。 片段NET_BUFFER结构和 MDL 描述的数据与父结构相同。 不会复制数据。

NdisAllocateFragmentNetBufferList 创建片段,从每个父NET_BUFFER结构中 已用数据空间 的开头开始,并偏移 StartOffset 参数中指定的值。

NdisAllocateFragmentNetBufferList 将每个源NET_BUFFER结构中使用的 数据空间 划分为片段。 每个片段 已用数据空间 的长度小于或等于 MaximumLength 参数中指定的值。 最后一个片段的 已用数据空间 可以小于 MaximumLength 。 新NET_BUFFER结构的数据偏移量按 DataOffsetDelta 参数中指定的字节数进行回退。

如果父 NET_BUFFER_LIST 结构中有多个 NET_BUFFER 结构 (图中未显示) 每个NET_BUFFER结构的碎片过程与单个结构的碎片过程相同。 例如,如果任何父NET_BUFFER结构中的最后一段数据小于最大大小,则 NDIS 不会将此类数据与下一个NET_BUFFER结构开头的数据合并。

NDIS 驱动程序调用 NdisFreeFragmentNetBufferList 函数以释放NET_BUFFER_LIST结构和以前通过调用 NdisAllocateFragmentNetBufferList 分配的所有相关NET_BUFFER结构和 MDL 链。

派生的 NET_BUFFER_LIST 结构