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 によって返され、以前に現在の IRP の転送要求の AllocateAdapterChannel に渡された DMA アダプター オブジェクトへのポインター。
[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 値を使用して散布/収集リストを作成し、転送操作に使用可能なすべてのマップ レジスタを使用するまで MapTransfer を 繰り返し呼び出すことができます。 ただし、このようなドライバーは、より単純に GetScatterGatherList ルーチンを使用できます。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 2000 以降で使用できます。 |
対象プラットフォーム | デスクトップ |
Header | wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む) |
IRQL | <= DISPATCH_LEVEL |
DDI コンプライアンス規則 | IrqlDispatch(wdm) |