NET_BUFFER 结构 (ndis/nbl.h)

NET_BUFFER结构指定通过网络传输或接收的数据。

语法

typedef struct _NET_BUFFER {
  union {
    struct {
      NET_BUFFER *Next;
      MDL        *CurrentMdl;
      ULONG      CurrentMdlOffset;
      union {
        ULONG  DataLength;
        SIZE_T stDataLength;
      };
      MDL        *MdlChain;
      ULONG      DataOffset;
    };
    SLIST_HEADER      Link;
    NET_BUFFER_HEADER NetBufferHeader;
  };
  USHORT           ChecksumBias;
  USHORT           Reserved;
  NDIS_HANDLE      NdisPoolHandle;
  PVOID            NdisReserved[2];
  PVOID            ProtocolReserved[6];
  PVOID            MiniportReserved[4];
  PHYSICAL_ADDRESS DataPhysicalAddress;
  union {
    NET_BUFFER_SHARED_MEMORY *SharedMemoryInfo;
    SCATTER_GATHER_LIST      *ScatterGatherList;
  };
} NET_BUFFER, *PNET_BUFFER;

成员

Next

指向NET_BUFFER结构链接列表中的下一个NET_BUFFER结构的指针。 如果此结构是列表中最后一个NET_BUFFER结构,则此成员为 NULL。

CurrentMdl

指向当前驱动程序使用的第一个 MDL 的指针。 此成员提供一种优化,通过跳过当前驱动程序未使用的任何 MDL 来提高性能。

CurrentMdlOffset

MDL 中由 CurrentMdl 成员指定的已用数据空间开头的偏移量(以字节为单位)。

DataLength

MDL 链中已用数据空间的长度(以字节为单位)。 最大长度为 0xFFFFFFFF 字节。

stDataLength

MDL 链中已用数据空间的长度(以字节为单位)。 最大长度为 0xFFFFFFFF 字节。 此成员与 DataLength 相同,但其类型为 SIZE_T 而不是 ULONG

MdlChain

指向映射数据缓冲区的 MDL 链接列表的指针。 数据缓冲区存储网络数据。

DataOffset

从 MDL 链的开头到 MDL 链中网络数据开头的偏移量(以字节为单位)。 此偏移量也是 未使用的数据空间的大小(以字节为单位)。

Link

保留给 NDIS。

NetBufferHeader

NET_BUFFER_HEADER结构。 出于兼容性原因,这是上述联合的重复项。

ChecksumBias

计算校验和时从数据缓冲区的开头跳过的字节数。 TCP/IP 协议使用此成员。

Reserved

保留供将来使用。

NdisPoolHandle

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

NdisReserved[2]

保留给 NDIS。

ProtocolReserved[6]

保留供协议驱动程序使用。 协议驱动程序和 NDIS 中间驱动程序可以将此区域用于自己的目的。 仅当此成员尚未使用时,中间驱动程序才能使用该成员。

MiniportReserved[4]

保留供微型端口驱动程序使用。 微型端口驱动程序和 NDIS 中间驱动程序可以将此区域用于自己的目的。

DataPhysicalAddress

注意 此成员的名称是 NDIS 6.0 驱动程序的 NdisReserved1 ,对于 NDIS 6.1 及更高版本的驱动程序,此成员的名称是 DataPhysicalAddress 。 对于 NDIS 6.0 驱动程序,此成员是为 NDIS 保留的。
 
帧数据部分的物理地址。 如果分配NET_BUFFER的驱动程序未指定地址,则此成员应为零。 仅当NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_HEADER或NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_PAYLOAD标志在与NET_BUFFER关联的NET_BUFFER_LIST结构的 NblFlags 成员中设置时,此成员才有效。
注意 微型端口驱动程序可以设置 NET_BUFFER 结构的 DataPhysicalAddress 成员,即使结构与拆分帧无关。 在这种情况下, DataPhysicalAddress 包含标头 MDL 的物理地址。
 

SharedMemoryInfo

指向 的指针 NET_BUFFER_SHARED_MEMORY 结构。

ScatterGatherList

SCATTER_GATHER_LIST 结构描述了 DMA 的散点/收集列表。

注解

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

NDIS 驱动程序可以调用分配NET_BUFFER_LIST结构池时,NdisAllocateNetBufferListPool 函数,然后将 NET_BUFFER_LIST_POOL_PARAMETERS 结构的 fAllocateNetBuffer 成员设置为 TRUE。 在这种情况下,NET_BUFFER结构预分配了驱动程序从池中分配的每个NET_BUFFER_LIST结构。

链接到每个NET_BUFFER结构是映射包含网络数据包数据的缓冲区的一个或多个缓冲区描述符。 这些缓冲区描述符指定为 NetBufferHeader 成员中的 MDL 链。 此类网络数据包数据已接收或将被传输。

若要访问 MDL 链中的其他数据空间,NDIS 驱动程序可以调用以下函数:

NDIS 驱动程序通常使用 NET_BUFFER 结构的 MiniportReservedProtocolReserved 成员来维护NET_BUFFER结构上下文信息。
注意 只有一个驱动程序可以使用 MiniportReservedProtocolReserved 成员。 因此,如果另一个驱动程序使用了其中任一成员,则中间驱动程序无法使用它们。
 
若要访问 NET_BUFFER 结构的成员,请使用以下宏和函数:

NET_BUFFER_NEXT_NB

NET_BUFFER_FIRST_MDL

NET_BUFFER_DATA_OFFSET

NET_BUFFER_DATA_LENGTH

NET_BUFFER_PROTOCOL_RESERVED

NET_BUFFER_MINIPORT_RESERVED

NET_BUFFER_CHECKSUM_BIAS

NET_BUFFER_CURRENT_MDL

NET_BUFFER_CURRENT_MDL_OFFSET

NdisGetPoolFromNetBuffer

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

要求

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

另请参阅

NET_BUFFER_CHECKSUM_BIAS

NET_BUFFER_CURRENT_MDL

NET_BUFFER_CURRENT_MDL_OFFSET

NET_BUFFER_DATA_LENGTH

NET_BUFFER_DATA_OFFSET

NET_BUFFER_FIRST_MDL

NET_BUFFER_HEADER

NET_BUFFER_LIST

NET_BUFFER_LIST_POOL_PARAMETERS

NET_BUFFER_MINIPORT_RESERVED

NET_BUFFER_NEXT_NB

NET_BUFFER_PROTOCOL_RESERVED

NdisAllocateNetBuffer

NdisAllocateNetBufferAndNetBufferList NdisAllocateNetBufferListPool

NdisGetPoolFromNetBuffer

NdisMSendNetBufferListsComplete NdisRetreatNetBufferDataStart NdisRetreatNetBufferListDataStart

SCATTER_GATHER_LIST