共用方式為


NdisMAllocateNetBufferSGList 函式 (ndis.h)

警告

針對 ARM 和 ARM64 處理器,我們強烈建議 NDIS 驅動程式寫入器使用 WDF DMA 或 WDM DMA,而不是 NDIS 散佈圖/收集 DMA。

如需 WDF DMA 的詳細資訊,請參閱 處理 KMDF 驅動程式中的 DMA 作業

如需 WDM DMA 的詳細資訊,請參閱 管理驅動程式輸入/輸出的 DMA 相關子主題。

總線主要迷你埠驅動程式會呼叫 NdisMAllocateNetBufferSGList 函式,以取得與 NET_BUFFER 結構相關聯的網路數據的散佈/收集清單。

語法

NDIS_STATUS NdisMAllocateNetBufferSGList(
  [in]           NDIS_HANDLE NdisMiniportDmaHandle,
  [in]           PNET_BUFFER NetBuffer,
  [in]           PVOID       Context,
  [in]           ULONG       Flags,
  [in, optional] PVOID       ScatterGatherListBuffer,
  [in]           ULONG       ScatterGatherListBufferSize
);

參數

[in] NdisMiniportDmaHandle

NDIS 用來管理 DMA 資源的內容區域的句柄。 呼叫端藉由呼叫 來取得此句柄 NdisMRegisterScatterGatherDma 函式。

[in] NetBuffer

NET_BUFFER 結構的指標。 NdisMAllocateNetBufferSGList 會為與此NET_BUFFER結構相關聯的網路數據配置散佈/收集清單。 散佈/收集清單是從在相關聯NET_BUFFER_DATA結構之 CurrentMdl 成員指定的 MDL 開頭開始的數據產生。

[in] Context

呼叫端所建立之內容區域的指標。 HAL 會在 HAL 建立散佈/收集清單之後,將此指標傳遞至 MiniportProcessSGList 。 呼叫端可以針對自己的用途使用此內容區域。

[in] Flags

可與 OR 作業結合的 NDIS 旗標。 若要清除所有旗標,請將此成員設定為零。 此函式支援NDIS_SG_LIST_WRITE_TO_DEVICE旗標;如果設定,則表示 DMA 傳輸的方向是從NET_BUFFER到裝置。 如果NDIS_SG_LIST_WRITE_TO_DEVICE清楚,則傳輸會來自裝置。 當 DMA 作業將資料從NET_BUFFER傳輸到裝置時,迷你埠驅動程式應該會在傳送路徑上設定此旗標。 從裝置執行 DMA 作業到預先配置的NET_BUFFER的迷你埠驅動程式,例如接收作業期間具有 chimney 卸除功能的 NIC,應該清除此旗標。

[in, optional] ScatterGatherListBuffer

如果不是 NULL,ScatterGatherListBuffer 會指定呼叫端配置來保存散佈/收集清單的記憶體指標。 如果 為 NULL,NDIS 會為散佈/收集清單配置記憶體。

[in] ScatterGatherListBufferSize

如果 ScatterGatherListBuffer 參數不是 NULL,ScatterGatherListBufferSize 會指定包含散佈/收集清單的緩衝區大小。 如果此大小太小,NDIS 會為散佈/收集清單配置記憶體。 如果 ScatterGatherListBuffer 參數為 NULL,則不會使用此參數。

傳回值

NdisMAllocateNetBufferSGList 會傳回下列其中一項:

傳回碼 Description
NDIS_STATUS_SUCCESS
NdisMAllocateNetBufferSGList 已成功為指定的NET_BUFFER結構建置散佈/收集清單。
NDIS_STATUS_RESOURCES
NdisMAllocateNetBufferSGList 因為資源不足而失敗。

備註

NDIS 總線主要迷你埠驅動程式會從其呼叫 NdisMAllocateNetBufferSGList MiniportSendNetBufferLists 函式 。 迷你埠驅動程式會針對每個必須取得散佈/收集清單的NET_BUFFER結構,呼叫 NdisMAllocateNetBufferSGList 一次。

當迷你埠驅動程式呼叫 NdisMAllocateNetBufferSGList 時,NDIS 會呼叫 HAL 來建置散佈/收集清單。 HAL 建置散佈/收集清單之後,它會呼叫 MiniportProcessSGList 函式,此函式是透過呼叫所註冊的miniport驅動程式 NdisMRegisterScatterGatherDma.

HAL 可以在 NDIS 傳回 NdisMAllocateNetBufferSGList 之前或之後呼叫 MiniportProcessSGList。 在 HAL 呼叫 MiniportProcessSGList 之前,迷你埠驅動程式不得嘗試存取散佈/收集清單。

為了改善系統效能,迷你埠驅動程序應該預先配置緩衝區,以用於 NdisMAllocateNetBufferSGListScatterGatherListBuffer 參數。 當迷你埠驅動程式呼叫 NdisMRegisterScatterGatherDma 時,NDIS 為 DmaDescription 參數的 ScatterGatherListSize 成員中的緩衝區提供建議的大小。 迷你埠驅動程式會在呼叫 NdisMAllocateNetBufferSGList 時,在 ScatterGatherListBufferSize 參數中指定緩衝區的大小。

即使迷你埠驅動程式在 ScatterGatherListBuffer 參數中指定緩衝區,NDIS 還是可能會配置緩衝區。 如果指定的緩衝區太小而無法保存散佈/收集清單,就會發生這種情況。 因此,驅動程式寫入器不得假設 ScatterGatherListBuffer 參數中指定的緩衝區包含散佈/收集清單。 HAL 會將正確的散佈/收集清單指標傳遞至迷你埠驅動程式的 MiniportProcessSGList 函式。

為了改善系統效能,從在相關聯NET_BUFFER_DATA結構之 CurrentMdl 成員指定的 MDL 開頭開始,從網路數據產生散佈/收集清單。 SG 清單中的網路數據的開頭會依相關聯NET_BUFFER_DATA結構 之 CurrentMdlOffset 成員中指定的值,從 SG 清單的開頭位移。

迷你埠驅動程序必須呼叫 NdisMFreeNetBufferSGList 函式以釋放散佈/收集清單。

規格需求

需求
最低支援的用戶端 NDIS 6.0 和更新版本支援。
目標平台 Universal
標頭 ndis.h (包括 Ndis.h)
程式庫 Ndis.lib
IRQL DISPATCH_LEVEL
DDI 合規性規則 Irql_Gather_DMA_Function (ndis)

另請參閱

MiniportProcessSGList

MiniportSendNetBufferLists

NDIS 散佈圖/收集 DMA

NET_BUFFER

NET_BUFFER_DATA

NdisMFreeNetBufferSGList

NdisMRegisterScatterGatherDma