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 适配器对象的指针,并以前传递给当前 IRP 传输请求的 AllocateAdapterChannel

[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