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 操作更新 CurrentVa 和 Length 。
支持散点/收集的总线主设备的驱动程序可以使用返回的逻辑地址和更新的 Length 值来生成散点/收集列表,并重复调用 MapTransfer ,直到它已使用所有可用的映射寄存器进行传输操作。 但是,此类驱动程序可以更简单地使用 GetScatterGatherList 例程。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 从 Windows 2000 开始可用。 |
目标平台 | 桌面 |
标头 | wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h) |
IRQL | <= DISPATCH_LEVEL |
DDI 符合性规则 | IrqlDispatch (wdm) |