共用方式為


分散NET_BUFFER_LIST結構

NDIS 驅動程式可以從現有的NET_BUFFER_LIST結構建立分散 NET_BUFFER_LIST 結構。 分散結構會參考一組參考原始資料的 NET_BUFFER 結構;不過,資料會分成不超過大小上限的單位。 驅動程式可以使用這種類型的結構,有效率地將大型緩衝區分成較小的緩衝區。

下圖顯示父系NET_BUFFER_LIST結構與分散子系之間的關聯性。

此圖顯示父系NET_BUFFER_LIST結構與其分散子結構之間的關聯性。

上圖包含父 系NET_BUFFER_LIST 結構和衍生自該父系的子結構。 父結構具有一 個NET_BUFFER_LIST_CONTEXT 結構,以及一個附加 MDL 的NET_BUFFER 結構。 父結構的父指標是 Null ,表示它不是衍生結構。

子NET_BUFFER_LIST結構有三個已附加 MDL 的NET_BUFFER結構。 子NET_BUFFER_LIST結構具有父結構的指標。 Null,其中NET_BUFFER_LIST_CONTEXT結構指標表示子系沒有NET_BUFFER_LIST_CONTEXT結構。

NDIS 驅動程式會呼叫 NdisAllocateFragmentNetBufferList 函式,以根據現有NET_BUFFER_LIST結構中的資料建立新的分散 NET_BUFFER_LIST 結構。 NDIS 會為分散NET_BUFFER_LIST結構配置新的 NET_BUFFER 結構和 MDL。 NDIS 不會為分散結構配置 NET_BUFFER_LIST_CONTEXT 結構。 片段NET_BUFFER結構和 MDL 會描述與父結構相同的資料。 不會複製資料。

NdisAllocateFragmentNetBufferList 會建立片段,從每個父系NET_BUFFER結構 中已使用的資料空間 開頭開始,並依 StartOffset 參數中指定的值位移。

NdisAllocateFragmentNetBufferList 會將每個來源中 已使用的資料空間 分割成片段NET_BUFFER結構。 每個片段 已使用之資料空間 的長度小於或等於 MaximumLength 參數中指定的值。 最後一個片段 的已使用資料空間 可以小於 MaximumLength 。 新NET_BUFFER結構的資料位移會受到 DataOffsetDelta 參數中指定的位元組數目所壓縮。

如果父NET_BUFFER_LIST結構中有多個 NET_BUFFER 結構 (圖中未顯示) 每個NET_BUFFER結構的片段程式與單一結構相同。 例如,如果任何父系NET_BUFFER結構中的最後一個資料片段小於大小上限,NDIS 就不會將這類資料與下一個NET_BUFFER結構開頭的資料結合。

NDIS 驅動程式會呼叫 NdisFreeFragmentNetBufferList 函式,以釋放NET_BUFFER_LIST結構,以及先前藉由呼叫 NdisAllocateFragmentNetBufferList所配置的所有相關NET_BUFFER結構和 MDL 鏈結。

衍生NET_BUFFER_LIST結構