共用方式為


PGET_SCATTER_GATHER_LIST_EX回呼函式 (wdm.h)

GetScatterGatherListEx 例程會配置 DMA 傳輸所需的資源、建置散佈/收集清單,並呼叫驅動程式提供的 AdapterListControl 例程來起始 DMA 傳輸。

警告

請勿針對系統 DMA 裝置呼叫此例程。

語法

PGET_SCATTER_GATHER_LIST_EX PgetScatterGatherListEx;

NTSTATUS PgetScatterGatherListEx(
  [in]            PDMA_ADAPTER DmaAdapter,
  [in]            PDEVICE_OBJECT DeviceObject,
  [in]            PVOID DmaTransferContext,
  [in]            PMDL Mdl,
  [in]            ULONGLONG Offset,
  [in]            ULONG Length,
  [in]            ULONG Flags,
  [in, optional]  PDRIVER_LIST_CONTROL ExecutionRoutine,
  [in, optional]  PVOID Context,
  [in]            BOOLEAN WriteToDevice,
  [in, optional]  PDMA_COMPLETION_ROUTINE DmaCompletionRoutine,
  [in, optional]  PVOID CompletionContext,
  [out, optional] PSCATTER_GATHER_LIST *ScatterGatherList
)
{...}

參數

[in] DmaAdapter

DMA_ADAPTER 結構的指標。 這個結構是代表驅動程式總線主要 DMA 裝置的配接器物件。 呼叫端從 先前呼叫IoGetDmaAdapter 例程取得此指標。

[in] DeviceObject

DEVICE_OBJECT 結構的指標。 此結構是 PDO (實體裝置物件,) ,代表所要求 DMA 作業的目標裝置。

[in] DmaTransferContext

已初始化 DMA 傳輸內容的指標。 此內容是由先前呼叫 InitializeDmaTransferContext 例程所初始化。 此內容在所有適配卡配置要求中都必須是唯一的。 若要取消擱置的配置要求,呼叫端必須將 DMA 傳輸內容提供給 CancelAdapterChannel 例程。

[in] Mdl

MDL 鏈結的指標,描述虛擬記憶體中鎖定緩衝區集合的實體頁面配置。 DMA 傳輸的散佈/收集清單會使用 OffsetLength 參數所指定的此記憶體區域。 如需 MDL 鏈結的詳細資訊,請參閱 使用 MDLs

[in] Offset

散佈圖/收集 DMA 傳輸的起始位移。 此參數是從 MDL 鏈結中第一個 MDL 緩衝區開頭的位元組位移。 如果 MDL 鏈結中的 MDL 指定緩衝區空間的 N 個字節總數, 則 Offset 的有效值會介於 0 到 N–1 的範圍內。

[in] Length

DMA 傳輸的長度,以位元組為單位。 如果 MDL 鏈結指定緩衝區空間的 N 個字節總數, 則 Length 的有效值會介於 1 到 N–Offset 的範圍內。

[in] Flags

配接器通道配置旗標。 支援下列旗標:

旗標 意義
DMA_SYNCHRONOUS_CALLBACK GetScatterGatherListEx 例程會以同步方式呼叫。 如果已設定此旗標,而且必要的 DMA 資源無法立即使用,則呼叫會失敗並傳回STATUS_INSUFFICIENT_RESOURCES。

如果已設定 DMA_SYNCHRONOUS_CALLBACK 旗標, ExecutionRoutine 參數是選擇性的,而且可以是 NULL。 如果未設定此旗標, ExecutionRoutine 必須是有效的非 NULL 指標。 如需此旗標的詳細資訊,請參閱一節。

[in, optional] ExecutionRoutine

驅動程式提供的 AdapterListControl 例程指標,起始驅動程式的 DMA 傳輸。 I/O 管理員會在為配接器物件配置必要的資源之後呼叫 AdapterListControl 例程。 在 AdapterListControl 例程傳回之後,I/O 管理員會自動釋放配接器對象和為此物件配置的資源。

如果已設定 DMA_SYNCHRONOUS_CALLBACK 旗標, ExecutionRoutine 參數是選擇性的,而且可以是 NULL。 如果此參數為 NULL,呼叫端可以使用 GetScatterGatherListEx 所配置的資源,在 GetScatterGatherListEx 傳回之後執行 DMA 傳輸。 如需詳細資訊,請參閱<備註>一節。

[in, optional] Context

驅動程式決定的配接器控件內容。 此內容會以 Context 參數的形式傳遞至 AdapterListControl 例程。

[in] WriteToDevice

DMA 傳輸的方向。 針對寫入作業將此參數設定為 TRUE,以將數據從記憶體傳輸到裝置。 針對讀取作業將此參數設定為 FALSE,以將資料從裝置傳輸到記憶體。

[in, optional] DmaCompletionRoutine

未使用。 設定為 NULL

[in, optional] CompletionContext

未使用。 設定為 NULL

[out, optional] ScatterGatherList

變數的指標,例程會將指標寫入已配置的散佈/收集清單。 此參數指向 SCATTER_GATHER_LIST 結構。 例程會配置這個結構及其所指向 的SCATTER_GATHER_ELEMENT 陣列。

ScatterGatherList 參數是選擇性的,如果 ExecutionRoutine 參數為非 NULL,則可以是 NULL。

如果已設定 DMA_SYNCHRONOUS_CALLBACK 旗標, 且 ExecutionRoutine 參數為 NULL則 ScatterGatherList 必須是有效的非 NULL 指標。 如果 ExecutionRoutine 不是 NULL則 ScatterGatherList 是選擇性的,如果呼叫驅動程式不需要散佈/收集清單,則可以是 NULL 。 如果設定DMA_SYNCHRONOUS_CALLBACK旗標且 ScatterGatherListExecutionRoutine 都是 NULL,或未設定DMA_SYNCHRONOUS_CALLBACK旗標且 ExecutionRoutineNULL,GetScatterGatherListEx 呼叫就會失敗。

傳回值

如果呼叫成功,GetScatterGatherListEx 會傳回STATUS_SUCCESS。 可能的錯誤傳回值包括下列狀態代碼:

傳回碼 Description
STATUS_INVALID_PARAMETERS 例程失敗,因為呼叫端傳遞的參數值無效。
STATUS_INSUFFICIENT_RESOURCES 例程無法配置 DMA 傳輸所需的資源。

備註

GetScatterGatherListEx 不是可直接依名稱呼叫的系統例程。 這個例程只能由 DMA_OPERATIONS結構中 傳回之位址的指標呼叫。 驅動程式會呼叫IoGetDmaAdapter,並將DeviceDescription參數的Version成員設定為DEVICE_DESCRIPTION_VERSION3,以取得此例程的位址。 如果 IoGetDmaAdapter 傳回 NULL,則您的平台上無法使用例程。

僅適用於總線主機適配卡的 GetScatterGatherListEx 。 請勿將此例程用於系統 DMA 配接器。

總線主機裝置的驅動程式可以使用 GetScatterGatherListEx ,將 AllocateAdapterChannelExMapTransferEx 例程所執行的作業合併成一個呼叫。 GetScatterGatherListEx 會執行下列作業:

  1. 配置 DMA 傳輸所需的資源。

  2. 根據 MdlOffsetLength 參數的值,建置散佈/收集清單。

  3. 呼叫驅動程式提供的 AdapterListControl 例程,並將散佈/收集清單提供給這個例程做為參數。

配置的資源會在 AdapterListControl 例程傳回之後自動釋放。 如果 GetScatterGatherListEx 是以同步方式呼叫 (也就是說,如果 DMA_SYNCHRONOUS_CALLBACK 旗標設定) ,則可以省略 AdapterListControl 例程。 在此情況下,呼叫端會使用已配置的資源,在 GetScatterGatherListEx 傳回之後起始 DMA 傳輸。 呼叫端必須明確釋放這些資源。

根據預設, GetScatterGatherListEx 會 以異步方式傳回,而不需要等待要求的資源配置完成。 在此傳回之後,呼叫端可以視需要呼叫 CancelAdapterChannel 例程來取消擱置的配置要求。

如果呼叫驅動程式設定 DMA_SYNCHRONOUS_CALLBACK 旗標, GetScatterGatherListEx 例程的行為如下:

  • 如果要求的資源無法立即使用, GetScatterGatherListEx 不會等候資源、不會建置散佈/收集清單,也不會呼叫 AdapterListControl 例程。 相反 地,GetScatterGatherListEx 會失敗並傳回STATUS_INSUFFICIENT_RESOURCES。

  • 如果已設定 DMA_SYNCHRONOUS_CALLBACK 旗標,則不需要驅動程式提供 AdapterListControl 例程。

  • 如果驅動程式提供 AdapterListControl 例程, DMA_SYNCHRONOUS_CALLBACK 旗標表示在呼叫線程的內容中呼叫此例程,然後再傳回 GetScatterGatherListEx

  • 如果驅動程式未提供 AdapterListControl 例程,驅動程式可以在 GetScatterGatherListEx 傳回之後,使用配置的資源和散佈/收集清單。 在此情況下,驅動程式必須提供有效的非 NULL ScatterGatherList 指標。 此外,在驅動程式起始 DMA 傳輸之後,驅動程式必須呼叫 FreeAdapterObject 例程,以釋放 GetScatterGatherListEx 為配接器物件配置的資源。

GetScatterGatherListExGetScatterGatherList 例程的擴充版本。 下列功能僅適用於擴充版本:

GetScatterGatherListEx 類似於 BuildScatterGatherListEx 例程,不同之處在於 GetScatterGatherListEx 會自動配置散佈/收集清單的緩衝區。

規格需求

需求
最低支援的用戶端 從 Windows 8 開始提供。
目標平台 桌面
標頭 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
IRQL <= DISPATCH_LEVEL

另請參閱

AdapterListControl

AllocateAdapterChannelEx

BuildScatterGatherListEx

CancelAdapterChannel

DEVICE_OBJECT

DMA_ADAPTER

DmaCompletionRoutine

FreeAdapterChannel

GetScatterGatherList

InitializeDmaTransferContext

IoGetDmaAdapter

MapTransferEx

SCATTER_GATHER_LIST