共用方式為


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 時,Length 的值會從 MapTransfer 傳回, 表示對應的位元組數目。 否則,Length 的輸入和輸出值相同。

[in] WriteToDevice

指出傳輸作業的方向:TRUE 從鎖定緩衝區傳輸至裝置。

傳回值

MapTransfer 會傳回對應區域的邏輯位址,這是總線主要適配卡的驅動程式可以使用的。 使用系統 DMA 控制器之裝置的驅動程式無法使用此值,而且應該予以忽略。

言論

MapTransfer 不是可以直接依名稱呼叫的系統例程。這個例程只能由在 DMA_OPERATIONS 結構中所傳回位址的指標呼叫,。 驅動程式藉由呼叫ioGetDmaAdapter 來取得此例程的位址。

DmaAdapter 必須已配置為驅動程式先前呼叫 AllocateAdapterChannel的結果。

當呼叫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