NET_BUFFER 结构
NDIS 6.0 及更高版本的 NET_BUFFER 结构类似于 NDIS 5 使用的 NDIS_PACKET 结构。x 和更早版本的驱动程序。 每个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 使用。 驱动程序通常使用的成员包括:
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 成员指定。
下图显示了 CurrentMdl、 CurrentMdlOffset、 DataOffset 和 DataLength 成员与数据空间之间的关系。
NDIS 提供用于管理 MDL 链中的数据空间的函数。 驱动程序如何使用数据空间与当前驱动程序一起动态更改。 有时,当前驱动程序当前未使用的数据空间。 尽管 未使用的数据空间 当前未使用,但它可以包含有效数据。 例如,在接收路径上, 未使用的数据空间 可以包含较低级别驱动程序使用的标头信息。
驱动程序执行撤退和前进操作,以增加和减少 已用数据空间。 有关撤退和高级操作的详细信息,请参阅 撤退和高级操作。
以下术语和定义描述了 NET_BUFFER 数据空间的元素:
已用数据空间
已用数据空间 包含当前驱动程序当前使用的数据。 驱动程序通过撤退操作增加 已用数据空间 ,并通过高级操作减少 已用数据空间 。
数据总大小
总数据大小是 已用数据空间 与 未使用数据空间大小之和。 若要计算总大小,请将 DataOffset 添加到 DataLength 。