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 宏來設定和取得 NetBufferListInfo 陣列中的值,NDIS_NET_BUFFER_LIST_INFO列舉值。
備註
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 緩衝區的詳細資訊,請參閱 NET_BUFFER架構。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | NDIS 6.0 和更新版本支援。 |
標頭 | ndis/nbl.h (include ndis.h) |