NET_BUFFER_LIST结构(ndis/nbl.h)

NET_BUFFER_LIST结构指定 NET_BUFFER 结构的链接列表。

语法

typedef struct _NET_BUFFER_LIST {
  union {
    struct {
      NET_BUFFER_LIST *Next;
      NET_BUFFER      *FirstNetBuffer;
    };
    SLIST_HEADER           Link;
    NET_BUFFER_LIST_HEADER NetBufferListHeader;
  };
  NET_BUFFER_LIST_CONTEXT *Context;
  NET_BUFFER_LIST         *ParentNetBufferList;
  NDIS_HANDLE             NdisPoolHandle;
  PVOID                   NdisReserved[2];
  PVOID                   ProtocolReserved[4];
  PVOID                   MiniportReserved[2];
  PVOID                   Scratch;
  NDIS_HANDLE             SourceHandle;
  ULONG                   NblFlags;
  LONG                    ChildRefCount;
  ULONG                   Flags;
  union {
    NDIS_STATUS Status;
    ULONG       NdisReserved2;
  };
  PVOID                   NetBufferListInfo[MaxNetBufferListInfo];
} NET_BUFFER_LIST, *PNET_BUFFER_LIST;

成员

Next

链中的下一个 NET_BUFFER_LIST 结构。

驱动程序不应直接访问此成员。 相反,它们应调用 NET_BUFFER_LIST_NEXT_NBL 宏。

FirstNetBuffer

NET_BUFFER_LIST的第一个 NET_BUFFER

驱动程序不应直接访问此成员。 相反,它们应调用 NET_BUFFER_LIST_FIRST_NB 宏。

Link

保留为 NDIS。

NetBufferListHeader

NET_BUFFER_LIST_HEADER 结构。

Context

指向 NET_BUFFER_LIST_CONTEXT 结构的指针。 协议和微型端口驱动程序使用此结构来存储有关NET_BUFFER_LIST结构的信息。 存储在NET_BUFFER_LIST_CONTEXT结构中的信息对 NDIS 和其他驱动程序在堆栈中是不透明的。

使用以下函数和宏访问NET_BUFFER_LIST_CONTEXT结构中的数据:

NdisAllocateNetBufferListContext NdisFreeNetBufferListContext NET_BUFFER_LIST_CONTEXT_DATA_START NET_BUFFER_LIST_CONTEXT_DATA_SIZE

ParentNetBufferList

如果此NET_BUFFER_LIST结构是另一个NET_BUFFER_LIST结构的克隆,则此成员指定指向父NET_BUFFER_LIST结构的指针。 否则,此参数 NULL。 驱动程序使用 NdisAllocateCloneNetBufferList 函数来创建克隆。

NdisPoolHandle

一个池句柄,用于标识从中分配NET_BUFFER_LIST结构的NET_BUFFER_LIST池。

NdisReserved[2]

保留供 NDIS 使用。

ProtocolReserved[4]

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

MiniportReserved[2]

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

Scratch

由NET_BUFFER_LIST结构的当前所有者定义的数据。 当前所有者(NDIS 或 NDIS 驱动程序)可以出于自己的目的使用此成员。 最初分配NET_BUFFER_LIST结构时,此成员 NULL。 在当前所有者放弃所有权后,NDIS 或其他驱动程序可以覆盖此成员。

SourceHandle

NDIS 在绑定或附加作中提供给驱动程序的句柄,方法是使用以下驱动程序提供的例程之一:

微型端口驱动程序

MiniportInitializeEx

协议驱动程序

ProtocolBindAdapterEx

筛选器驱动程序

FilterAttach

NDIS 使用 SourceHandle 将NET_BUFFER_LIST结构返回到发送NET_BUFFER_LIST结构的驱动程序。

NblFlags

此成员包含可与按位 OR作组合的标志。

使用 NdisTestNblFlagNdisTestNblFlagsNdisSetNblFlag,以及 NdisClearNblFlag 宏访问标志。

如果中间驱动程序和筛选器驱动程序不修改与NET_BUFFER_LIST关联的数据,则可以设置以下标志。 例如,如果数据未更改,NDIS 可能会重复使用创建NET_BUFFER_LIST的原始信息。

NDIS_NBL_FLAGS_SEND_READ_ONLY

如果已设置,则NET_BUFFER_LIST结构及其数据对于发送作是只读的。

NDIS_NBL_FLAGS_RECV_READ_ONLY

如果已设置,则NET_BUFFER_LIST结构及其数据对于接收作是只读的。

即使驱动程序未拆分关联的以太网帧,驱动程序也可以设置以下标志:

NDIS_NBL_FLAGS_IS_IPV4

此NET_BUFFER_LIST结构中的所有以太网帧都是 IPv4 帧。 如果设置了此标志,标头数据拆分提供程序不得设置NDIS_NBL_FLAGS_IS_IPV6标志。

NDIS_NBL_FLAGS_IS_IPV6

此NET_BUFFER_LIST结构中的所有以太网帧都是 IPv6 帧。 如果设置了此标志,标头数据拆分提供程序不得设置NDIS_NBL_FLAGS_IS_IPV4标志。

NDIS_NBL_FLAGS_IS_TCP

此NET_BUFFER_LIST结构中的所有以太网帧都是 TCP 帧。 如果设置了此标志,标头数据拆分提供程序不得设置NDIS_NBL_FLAGS_IS_UDP标志,并且提供程序必须设置NDIS_NBL_FLAGS_IS_IPV4标志或NDIS_NBL_FLAGS_IS_IPV6标志。

NDIS_NBL_FLAGS_IS_UDP

此NET_BUFFER_LIST结构中的所有以太网帧都是 UDP 帧。 如果设置了此标志,标头数据拆分提供程序不得设置NDIS_NBL_FLAGS_IS_TCP标志,并且提供程序必须设置NDIS_NBL_FLAGS_IS_IPV4标志或NDIS_NBL_FLAGS_IS_IPV6标志。

NDIS_NBL_FLAGS_IS_LOOPBACK_PACKET

与此NET_BUFFER_LIST结构关联的所有数据包都是环回数据包。

如果标头数据拆分提供程序未拆分关联的以太网帧,微型端口驱动程序必须指示已清除以下标志的NET_BUFFER_LIST结构:

NDIS_NBL_FLAGS_HD_SPLIT

标头和数据拆分为与此NET_BUFFER_LIST结构关联的所有以太网帧。

NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_HEADER

此NET_BUFFER_LIST中的所有以太网帧在上层协议标头的开头拆分。 如果设置了此标志,标头数据拆分提供程序必须设置NDIS_NBL_FLAGS_IS_IPV4标志或NDIS_NBL_FLAGS_IS_IPV6标志。 此外,提供程序可以设置NDIS_NBL_FLAGS_IS_TCP标志或NDIS_NBL_FLAGS_IS_UDP标志,但提供程序不得设置NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_PAYLOAD标志。

NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_PAYLOAD

此NET_BUFFER_LIST结构中的所有以太网帧在 TCP 或 UDP 有效负载的开头拆分。 如果设置了此标志,标头数据拆分提供程序必须设置NDIS_NBL_FLAGS_IS_IPV4标志或NDIS_NBL_FLAGS_IS_IPV6标志。 此外,提供程序必须设置NDIS_NBL_FLAGS_IS_TCP标志或NDIS_NBL_FLAGS_IS_UDP标志,但提供程序不得设置NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_HEADER标志。

ChildRefCount

如果此NET_BUFFER_LIST结构具有克隆(为父级),则此成员指定未完成的克隆数。 否则,此成员为零。

Flags

NET_BUFFER_LIST结构的属性。 以下定义为一组标志指定位掩码:

NBL_FLAGS_PROTOCOL_RESERVED

此集是为协议驱动程序保留的。

注意, 从 NDIS 6.30 开始,两个附加位可用于协议使用:0x00000003。 仅当 NdisGetVersion 返回大于或等于 NDIS_RUNTIME_VERSION_630的值时,NDIS 6.30 协议才可使用这些位。 协议不得在早期版本的 NDIS 上使用这些位,因为 NDIS 在 6.30 之前,NDIS 在内部使用这些位。
 

NBL_FLAGS_MINIPORT_RESERVED

此集是为微型端口驱动程序保留的。

NBL_FLAGS_SCRATCH

NET_BUFFER_LIST结构的当前所有者(NDIS 或 NDIS 驱动程序)可以使用此设置。 当当前所有者放弃所有权时,NDIS 或其他驱动程序可以覆盖这些标志。

NBL_FLAGS_NDIS_RESERVED

此集是为 NDIS 保留的。

Status

此NET_BUFFER_LIST结构上网络数据作的最终完成状态。 微型端口驱动程序在调用 之前写入此值 NdisMSendNetBufferListsComplete 函数。 微型端口驱动程序指定以下值之一:

NDIS_STATUS_SUCCESS

与此NET_BUFFER_LIST结构关联的NET_BUFFER结构描述的所有网络数据都通过网络成功传输。

NDIS_STATUS_INVALID_LENGTH

与此NET_BUFFER_LIST结构关联的某些NET_BUFFER结构中的数据大小对于基础 NIC 来说太大。

NDIS_STATUS_RESOURCES

由于资源不足,此NET_BUFFER_LIST结构的发送请求失败。

NDIS_STATUS_FAILURE

此NET_BUFFER_LIST结构的发送请求由于前面三个值中所述的一些原因而失败。

NDIS_STATUS_SEND_ABORTED

NDIS 调用 MiniportCancelSend 函数以取消此NET_BUFFER_LIST结构的发送作。

NDIS_STATUS_RESET_IN_PROGRESS

微型端口驱动程序由于重置而中止了发送请求。

NDIS_STATUS_PAUSED

如果驱动程序因暂停而必须拒绝发送请求,则会将每个受影响的NET_BUFFER_LIST中的完整状态设置为NDIS_STATUS_PAUSED。

NdisReserved2

保留为 NDIS。

NetBufferListInfo[MaxNetBufferListInfo]

一个值数组,其中包含列表中所有NET_BUFFER结构共有的信息。 此信息通常称为“带外(OOB)数据”。

使用使用 NET_BUFFER_LIST_INFO NDIS_NET_BUFFER_LIST_INFO 枚举值来设置和获取 NetBufferListInfo 数组中的值。

言论

NDIS 驱动程序可以调用以下任一函数来分配和初始化NET_BUFFER_LIST结构:

NdisAllocateNetBufferList

NdisAllocateNetBufferAndNetBufferList NdisAllocateCloneNetBufferList NdisAllocateFragmentNetBufferList NdisAllocateReassembledNetBufferList

与NET_BUFFER_LIST结构关联的所有NET_BUFFER结构都具有由 NetBufferListInfoContext 成员指定的属性。

当驱动程序调用 NdisSendNetBufferListsNdisFSendNetBufferLists 函数时,它将失去以下项的所有权:

  • 指定的NET_BUFFER_LIST结构。
  • 附加 NET_BUFFER 结构和 MDL。
  • 任何附加NDIS_REQUEST_CONTROLs。
  • 与NET_BUFFER_LIST结构关联的所有 NetBufferListInfo 数据。
NET_BUFFER_LIST结构列表的当前所有者可以将NET_BUFFER_LIST结构移动到另一个列表。 但是,与NET_BUFFER_LIST结构关联的所有NET_BUFFER结构都应保持相同的NET_BUFFER_LIST结构。 只有创建NET_BUFFER结构的驱动程序才能将它们移动到不同的NET_BUFFER_LIST结构。 当前所有者无法修改NET_BUFFER结构的下一个 成员

NET_BUFFER_LIST结构列表是一个简单的单向链接列表和以 NULL 结尾的列表。 要将NET_BUFFER_LIST结构移动到其他列表,请对源列表和目标列表中的 下一 成员进行适当的更新。

若要访问NET_BUFFER_LIST结构的成员,请使用以下宏和函数:

NET_BUFFER_LIST_NEXT_NBL

NET_BUFFER_LIST_FIRST_NB

NET_BUFFER_LIST_FLAGS

NET_BUFFER_LIST_MINIPORT_RESERVED NET_BUFFER_LIST_CONTEXT_DATA_START NET_BUFFER_LIST_CONTEXT_DATA_SIZE

NET_BUFFER_LIST_INFO

NET_BUFFER_LIST_STATUS

NET_BUFFER_LIST_PROTOCOL_RESERVED NdisGetPoolFromNetBufferList

有关如何使用 net 缓冲区的详细信息,请参阅 NET_BUFFER 体系结构

要求

要求 价值
最低支持的客户端 NDIS 6.0 及更高版本中受支持。
标头 ndis/nbl.h (include ndis.h)

另请参阅

NDIS_NET_BUFFER_LIST_INFO

NET_BUFFER

NET_BUFFER_LIST_CONTEXT

NET_BUFFER_LIST_CONTEXT_DATA_SIZE NET_BUFFER_LIST_CONTEXT_DATA_START

NET_BUFFER_LIST_FIRST_NB

NET_BUFFER_LIST_FLAGS

NET_BUFFER_LIST_HEADER

NET_BUFFER_LIST_INFO

NET_BUFFER_LIST_MINIPORT_RESERVED

NET_BUFFER_LIST_NEXT_NBL

NET_BUFFER_LIST_PROTOCOL_RESERVED

NET_BUFFER_LIST_STATUS

NdisAllocateCloneNetBufferList NdisAllocateFragmentNetBufferList NdisAllocateNetBufferAndNetBufferList

NdisAllocateNetBufferList

NdisAllocateNetBufferListContext NdisAllocateReassembledNetBufferList

NdisCancelSendNetBufferLists

NdisClearNblFlag

NdisFreeNetBufferListContext

NdisGeneratePartialCancelId

NdisGetPoolFromNetBufferList

NdisSendNetBufferLists

NdisSetNblFlag

NdisTestNblFlag

NdisTestNblFlags