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
指定 MDL 中已用数据空间开头的偏移量(以字节为单位),该偏移量由 NET_BUFFER 结构的 CurrentMdl 成员指定。

下图显示了 CurrentMdlCurrentMdlOffsetDataOffsetDataLength 成员与数据空间之间的关系。

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

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

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

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

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

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

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

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

进展
高级操作会减小 已用数据空间的大小。