PGET_SCATTER_GATHER_LIST回调函数 (wdm.h)
GetScatterGatherList 例程通过系统 DMA 控制器或总线主适配器,代表目标设备对象为 DMA 散点/收集作准备系统。
语法
PGET_SCATTER_GATHER_LIST PgetScatterGatherList;
NTSTATUS PgetScatterGatherList(
[in] PDMA_ADAPTER DmaAdapter,
[in] PDEVICE_OBJECT DeviceObject,
[in] PMDL Mdl,
[in] PVOID CurrentVa,
[in] ULONG Length,
[in] PDRIVER_LIST_CONTROL ExecutionRoutine,
[in] PVOID Context,
[in] BOOLEAN WriteToDevice
)
{...}
参数
[in] DmaAdapter
指向 IoGetDmaAdapter 返回的 DMA_ADAPTER 结构的指针,该结构表示总线主适配器或 DMA 控制器。
[in] DeviceObject
指向表示 DMA作的目标设备的设备对象的指针。
[in] Mdl
指向描述当前 IRP 中 MdlAddress 缓冲区的 MDL 的指针。
[in] CurrentVa
指向 MDL 中要为 DMA 传输作映射的缓冲区的当前虚拟地址的指针。
[in] Length
指定要映射的长度(以字节为单位)。
[in] ExecutionRoutine
指向驱动程序提供的 AdapterListControl 例程的指针,当系统 DMA 控制器或总线主适配器可用时,会在DISPATCH_LEVEL调用该例程。
[in] Context
指向在调用驱动程序时传递给驱动程序的 AdapterListControl 例程的驱动程序确定上下文的指针。
[in] WriteToDevice
指示 DMA 传输的方向:TRUE 从缓冲区传输到设备,否则 FALSE。
返回值
此例程可以返回以下 NTSTATUS 值之一。
返回代码 | 描述 |
---|---|
|
作成功。 |
|
例程无法分配足够的内存,或者传输所需的映射寄存器数大于 IoGetDmaAdapter返回的值。 |
|
缓冲区太小,无法进行请求的传输。 |
言论
GetScatterGatherList 例程动态分配一个缓冲区来保存散点/收集列表。 有关缓冲区分配失败的可能 NTSTATUS 值,请参阅返回值。
GetScatterGatherList 不是可以直接按名称调用的系统例程。 此例程只能通过从 DMA_OPERATIONS 结构中返回的地址的指针进行调用。 驱动程序通过调用 IoGetDmaAdapter获取此例程的地址。
GetScatterGatherList 创建散点/收集列表,初始化映射寄存器,然后调用驱动程序提供的 AdapterListControl 例程来执行 I/O作,然后立即提供相应的 DMA 通道和任何必要的映射寄存器。
GetScatterGatherList 将 AllocateAdapterChannel 的作与执行散点/收集 DMA 的驱动程序 MapTransfer 例程相结合。 GetScatterGatherList 确定传输所需的映射寄存器数、分配映射寄存器、映射 DMA 的缓冲区以及填充散点/收集列表。 然后,它会调用提供的 AdapterListControl 例程,将指针传递给 ScatterGather中的散点/收集列表。 驱动程序应保留此指针,以便在 调用 putScatterGatherList时使用。 请注意,GetScatterGatherList 没有适用于 AllocateAdapterChannel的队列限制。
在 AdapterListControl 例程中,驱动程序应执行 I/O。 从驱动程序提供的例程返回时,GetScatterGatherList 保留映射寄存器,但释放 DMA 适配器结构。 驱动程序必须调用 PutScatterGatherList(刷新缓冲区),然后才能访问缓冲区中的数据。
此例程可以处理链接的 MDL,前提是所有链接的 MDL 所需的映射寄存器总数不超过可用的映射寄存器数。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | 在 Windows 2000 及更高版本的 Windows 中可用。 Windows 98 或 Windows Me 不支持。 |
目标平台 | 桌面 |
标头 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
IRQL | DISPATCH_LEVEL |
DDI 符合性规则 | IrqlDispatch(storport)、IrqlDispatch(storport)、IrqlDispatch(wdm) |