共用方式為


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)數據」。

使用 NDIS_NET_BUFFER_LIST_INFO 列舉值與 NET_BUFFER_LIST_INFO 巨集,以在 netBufferListInfo 陣列中設定和取得值。

言論

NDIS 驅動程式可以呼叫下列任一函式來配置和初始化NET_BUFFER_LIST結構:

NdisAllocateNetBufferList

NdisAllocateNetBufferAndNetBufferList NdisAllocateCloneNetBufferList NdisAllocateFragmentNetBufferList NdisAllocateReassembledNetBufferList

與NET_BUFFER_LIST結構相關聯的所有NET_BUFFER結構都有由 netBufferListInfo Context 成員所指定的屬性。

當驅動程式呼叫 NdisSendNetBufferListsNdisFSendNetBufferLists 函式時,它會失去下列專案的擁有權:

  • 指定的NET_BUFFER_LIST結構。
  • 附加 NET_BUFFER 結構和 MDL。
  • 任何附加NDIS_REQUEST_CONTROLs。
  • 所有 NetBufferListInfo 都會 與NET_BUFFER_LIST結構相關聯的數據。
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