共用方式為


分散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 結構