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 運算結合的旗標。

使用 NdisTestNblFlag、NdisTestNblFlagsNdisSetNblFlagNdisClearNblFlag 宏來存取旗標。

如果中繼驅動程式和篩選驅動程式未修改與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 宏來設定和取得 NetBufferListInfo 陣列中的值,NDIS_NET_BUFFER_LIST_INFO列舉值。

備註

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 緩衝區的詳細資訊,請參閱 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