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结构具有指向父结构的指针。 NULL,其中NET_BUFFER_LIST_CONTEXT结构指针将指示子级没有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 链。