NET_BUFFER结构

NDIS 6.0 及更高版本 NET_BUFFER 结构类似于 NDIS 5 使用的 NDIS_PACKET 结构。x 和早期驱动程序。 每个NET_BUFFER结构都会打包一个网络数据包。

下图显示了NET_BUFFER结构中的字段。

显示NET_BUFFER结构中的字段的关系图。

NET_BUFFER结构包括 NetBufferHeader 成员中的 NET_BUFFER_HEADER 结构。 NET_BUFFER_HEADER结构包括 NetBufferData 成员中的 NET_BUFFER_DATA 结构。 应使用 NDIS 宏访问NET_BUFFER结构成员。 有关这些宏的完整列表,请参阅 NET_BUFFER 结构参考页。

某些 NET_BUFFER 结构成员仅由 NDIS 使用。 驱动程序通常使用的成员包括:

ProtocolReserved
保留供协议驱动程序使用。

MiniportReserved
保留供微型端口驱动程序使用。

NdisPoolHandle
指定一个池句柄,用于标识从中分配NET_BUFFER结构的NET_BUFFER池。

下一个
指定指向NET_BUFFER结构链接列表中的下一个NET_BUFFER结构的指针。 如果这是列表中的最后一个NET_BUFFER结构,则此成员 NULL

DataLength
指定 MDL 链中网络数据的长度(以字节为单位)。

DataOffset
指定从 MDL 链中的内存开始到 MDL 链中网络数据的开始的偏移量(以字节为单位)。

CurrentMdl
指定指向当前驱动程序正在使用的第一个 MDL 的指针。 此指针提供优化,通过跳过当前驱动程序未使用的任何 MDL 来提高性能。

CurrentMdlOffset
指定由 NET_BUFFER 结构的 CurrentMdl 成员指定的 MDL 中已用数据空间的开头的偏移量(以字节为单位)。

下图显示了 CurrentMdlCurrentMdlOffsetDataOffset以及 DataLength 成员和数据空间之间的关系。

关系图,描述与 CurrentMdl、CurrentMdlOffset、DataOffset 和 DataLength 相关的数据空间分配。

NDIS 提供用于管理 MDL 链中的数据空间的函数。 驱动程序如何将数据空间动态地与当前驱动程序一起使用。 有时,当前驱动程序当前未使用的数据空间。 尽管 未使用的数据空间 当前未使用,但它可以包含有效的数据。 例如,在接收路径上,未使用的数据空间 可以包含较低级别驱动程序使用的标头信息。

驱动程序执行撤退和推进作,以增加和减少 使用的数据空间。 有关撤退和提前作的详细信息,请参阅 撤退和提前作

以下术语和定义描述了 NET_BUFFER 数据空间的元素:

已用数据空间
已用数据空间 包含当前驱动程序当前正在使用的数据。 驱动程序通过撤退作增加 已用数据空间,并通过提前作减少 已用数据空间

未使用的数据空间
当前驱动程序当前未使用此数据空间。

数据总大小
总数据大小是 已用数据空间未使用的数据空间的总和。 若要计算总大小,请将 DataOffset 添加到 DataLength

撤退
撤退作会增加已用数据空间 的大小

提前
高级作会减少 已用数据空间的大小。