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 链的详细信息,请参阅 使用 MDL

[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 标志且 ScatterGatherList 和 ExecutionRoutine 均为 NULL,或者未设置 DMA_SYNCHRONOUS_CALLBACK 标志且 ExecutionRoutineNULL则 GetScatterGatherListEx 调用将失败。

返回值

如果调用成功,GetScatterGatherListEx 将返回STATUS_SUCCESS。 可能的错误返回值包括以下状态代码:

返回代码 说明
STATUS_INVALID_PARAMETERS 由于调用方传递的参数值无效,例程失败。
STATUS_INSUFFICIENT_RESOURCES 例程未能分配 DMA 传输所需的资源。

注解

GetScatterGatherListEx 不是可直接按名称调用的系统例程。 此例程只能由 DMA_OPERATIONS 结构中返回的地址中的指针调用。 驱动程序通过调用 IoGetDmaAdapter 获取此例程的地址,并将 DeviceDescription 参数的 Version 成员设置为 DEVICE_DESCRIPTION_VERSION3。 如果 IoGetDmaAdapter 返回 NULL,则例程在平台上不可用。

仅对总线主适配器使用 GetScatterGatherListEx 。 请勿将此例程用于系统 DMA 适配器。

总线主设备的驱动程序可以使用 GetScatterGatherListExAllocateAdapterChannelExMapTransferEx 例程执行的操作合并到一个调用中。 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