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 运算组合的标志。

使用 NdisTestNblFlagNdisTestNblFlagsNdisSetNblFlagNdisClearNblFlag 宏访问标志。

如果中间驱动程序和筛选器驱动程序不修改与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 上使用这些位,因为在 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 结构的 Next 成员。

NET_BUFFER_LIST结构列表是一个简单的单独链接且以 NULL 结尾的列表。 若要将NET_BUFFER_LIST结构移到其他列表,请对源列表和目标列表中的 Next 成员进行相应的更新。

若要访问 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_BUFFER 体系结构

要求

要求
最低受支持的客户端 在 NDIS 6.0 及更高版本中受支持。
标头 ndis/nbl.h (包括 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