次の方法で共有


共通バッファー DMA 用のシステム DMA コントローラーのセットアップ

AllocateAdapterChannel がドライバーの AdapterControl ルーチンに制御を移すと、ドライバーはシステム DMA コントローラとマップレジスタのセットを「所有」します。 その後、ドライバーは MapTransfer を呼び出して、ドライバーが転送操作のためにデバイスを設定する前に、ドライバーが割り当てた共通バッファを使用するようにシステム DMA コントローラを設定する必要があります。

ドライバーは MapTransferに以下のパラメータを提供します:

  • IoGetDmaAdapterによって返されるアダプタオブジェクトポインター

  • ドライバーが割り当てた共通バッファを記述する MDL へのポインター

  • AllocateAdapterChannelによってドライバーの AdapterControl ルーチンに渡された MapRegisterBase ハンドル

  • ドライバーが割り当てた共通バッファのサイズをバイト単位で示す変数 (Length) へのポインター

  • 転送操作方向を示すブール値 (システム メモリからデバイスへの要求された転送の場合は TRUE)

MapTransfer は論理アドレスを返しますが、システムDMAを使用するドライバーは無視する必要があります。 MapTransfer が制御を返すとき、ドライバーはDMA操作のためにデバイスを設定する必要があります。 ドライバーは MapTransfer を一度だけ呼び出しますが、要求された転送が完了するまで、共通バッファとロックダウンされたユーザバッファの間でデータのコピーを続けます。

ドライバーは、 ReadDmaCounter を呼び出して、コモンバッファに現在転送すべきバイトがいくつ残っているかを判断することができます。その後、ドライバーは、DMA操作の方向に応じて、共通バッファをユーザーデータで満たし続けるか、共通バッファからユーザーバッファにデータをコピーすることができます。

転送が完了するか、ドライバーが IRP に対してエラー状態を返さなければならない場合、ドライバーは FlushAdapterBuffers を呼び出し、システム DMA コントローラにキャッシュされたデータがシステムメモリに読み込まれるか、デバイスに書き出されるようにします。 その後、ドライバーは FreeAdapterChannel を速やかに呼び出して、(それ自体を含む)どのドライバーでも使用できるようにシステム DMA コントローラをリリースする必要があります。