PMAP_TRANSFER回调函数 (wdm.h)

MapTransfer 例程为适配器对象设置映射寄存器,以映射锁定缓冲区中的 DMA 传输。

语法

PMAP_TRANSFER PmapTransfer;

PHYSICAL_ADDRESS PmapTransfer(
  [in]      PDMA_ADAPTER DmaAdapter,
  [in]      PMDL Mdl,
  [in]      PVOID MapRegisterBase,
  [in]      PVOID CurrentVa,
  [in, out] PULONG Length,
  [in]      BOOLEAN WriteToDevice
)
{...}

参数

[in] DmaAdapter

指向 IoGetDmaAdapter 返回的 DMA 适配器对象的指针,该对象以前传递给 AllocateAdapterChannel 以用于当前 IRP 的传输请求。

[in] Mdl

指向以下项之一的指针:描述当前 IRP 中 MdlAddress 处的缓冲区的 MDL,或描述从属设备的驱动程序 (自动初始化模式) 设置的公共缓冲区的 MDL。

[in] MapRegisterBase

指定为 DMA 操作分配的映射寄存器。 系统将此值传递给驱动程序的 AdapterControl 例程。

[in] CurrentVa

指向要为 DMA 传输操作传输的数据的当前虚拟地址的指针。

[in, out] Length

指定要映射的长度(以字节为单位)。 如果驱动程序在调用 IoGetDmaAdapter 时指示其设备是支持散点/收集的总线主机,则从 MapTransfer 返回时的 Length 值指示映射了多少字节。 否则, Length 的输入和输出值是相同的。

[in] WriteToDevice

指示传输操作的方向:对于从锁定的缓冲区到设备的传输,为 TRUE

返回值

MapTransfer 返回映射的区域的逻辑地址,总线-主适配器的驱动程序可以使用该地址。 使用系统 DMA 控制器的设备驱动程序不能使用此值,应忽略此值。

注解

MapTransfer 不是可直接按名称调用的系统例程。此例程只能由DMA_OPERATIONS 结构中返回的地址中的指针调用 。 驱动程序通过调用 IoGetDmaAdapter 获取此例程的地址。

由于驱动程序先前调用 AllocateAdapterChannel,DmaAdapter 必须已分配。

可以设置的映射寄存器数不能超过驱动程序调用 IoGetDmaAdapter 时返回的最大值。

驱动程序可以通过调用 MmGetMdlVirtualAddress 获取开始基于数据包的 DMA 传输的初始 CurrentVa。 但是,返回的值是 Mdl 中的索引,而不是有效的虚拟地址。 如果驱动程序必须将大型传输请求拆分为多个 DMA 操作,则必须为每个 DMA 操作更新 CurrentVaLength

支持散点/收集的总线主设备的驱动程序可以使用返回的逻辑地址和更新的 Length 值来生成散点/收集列表,并重复调用 MapTransfer ,直到它已使用所有可用的映射寄存器进行传输操作。 但是,此类驱动程序可以更简单地使用 GetScatterGatherList 例程。

要求

要求
最低受支持的客户端 从 Windows 2000 开始可用。
目标平台 桌面
标头 wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h)
IRQL <= DISPATCH_LEVEL
DDI 符合性规则 IrqlDispatch (wdm)

另请参阅

ADDRESS_AND_SIZE_TO_SPAN_PAGES

AllocateAdapterChannel

AllocateCommonBuffer

DMA_ADAPTER

FlushAdapterBuffers

FreeAdapterChannel

FreeMapRegisters

IoGetDmaAdapter

KeFlushIoBuffers

MmGetMdlVirtualAddress