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 作業更新 CurrentVa 和 Length。
具有散佈/收集支援之總線主機裝置的驅動程式可以使用傳回的邏輯位址,並更新 Length 值來建置散佈/收集清單,並重複呼叫 MapTransfer,直到它已使用所有可用的地圖緩存器進行傳輸作業為止。 不過,這類驅動程式可以更簡單地使用 getScatterGatherList 例程。
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | 從 Windows 2000 開始提供。 |
目標平臺 | 桌面 |
標頭 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
IRQL | <= DISPATCH_LEVEL |
DDI 合規性規則 | IrqlDispatch(wdm) |