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
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_SIZEParentNetBufferList
如果此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 使用以下驱动程序提供的例程之一在绑定或附加操作中提供给驱动程序的句柄:
微型端口驱动程序
协议驱动程序
筛选器驱动程序
NDIS 使用 SourceHandle 将NET_BUFFER_LIST结构返回到发送NET_BUFFER_LIST结构的驱动程序。
NblFlags
此成员包含可与按位 OR 运算组合的标志。
使用 NdisTestNblFlag、 NdisTestNblFlags、 NdisSetNblFlag 和 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
此集是为协议驱动程序保留的。
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结构:
NdisAllocateNetBufferAndNetBufferList NdisAllocateCloneNetBufferList NdisAllocateFragmentNetBufferList NdisAllocateReassembledNetBufferList与 NET_BUFFER_LIST 结构关联的所有NET_BUFFER结构都具有 NetBufferListInfo 和 Context 成员指定的属性。
当驱动程序调用 NdisSendNetBufferLists 或 NdisFSendNetBufferLists 函数时,它将失去以下项的所有权:
- 指定的NET_BUFFER_LIST结构。
- 附加 NET_BUFFER 结构和 MDL。
- 任何附加NDIS_REQUEST_CONTROLs。
- 与 NET_BUFFER_LIST 结构关联的所有 NetBufferListInfo 数据。
NET_BUFFER_LIST结构列表是一个简单的单独链接且以 NULL 结尾的列表。 若要将NET_BUFFER_LIST结构移到其他列表,请对源列表和目标列表中的 Next 成员进行相应的更新。
若要访问 NET_BUFFER_LIST 结构的成员,请使用以下宏和函数:
NET_BUFFER_LIST_MINIPORT_RESERVED NET_BUFFER_LIST_CONTEXT_DATA_START NET_BUFFER_LIST_CONTEXT_DATA_SIZE NET_BUFFER_LIST_PROTOCOL_RESERVED NdisGetPoolFromNetBufferList有关如何使用净缓冲区的详细信息,请参阅 NET_BUFFER 体系结构。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 在 NDIS 6.0 及更高版本中受支持。 |
标头 | ndis/nbl.h (包括 ndis.h) |