共用方式為


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來取得此例程的位址。

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