パケットベース システム DMA の使用
パケットベース DMA を使用する下位デバイスのドライバーは、DMA 転送を要求する IRP を処理する次の一般的な一連のサポート ルーチンを呼び出します。
システム DMA コントローラーの割り当てを試みる直前の KeFlushIoBuffers。(詳細については、キャッシュの一貫性の維持を参照)
ドライバーが DMA 用にデバイスをプログラミングする準備が整い、システム DMA コントローラーが必要な場合の AllocateAdapterChannel。
AllocateAdapterChannel は、ドライバーの AdapterControl ルーチンを呼び出します。
MapTransfer の最初の呼び出しでパラメーターとして必要な MDL にインデックスを取得するための MmGetMdlVirtualAddress。
転送操作用のシステム DMA コントローラーをプログラムする MapTransfer。
ドライバーは、転送要求の分割で説明されているように、要求されたすべてのデータを転送するために MapTransfer を複数回呼び出す必要がある場合があります。
下位デバイス間の各 DMA 転送操作の直後の FlushAdapterBuffers。
ドライバーが要求されたすべてのデータを転送するために MapTransfer を複数回呼び出す必要がある場合は、MapTransfer を呼び出す回数だけ FlushAdapterBuffers を呼び出す必要があります。
要求されたデータがすべて転送され次第、またはデバイスの I/O エラーが原因でドライバーが IRP に失敗する場合の FreeAdapterChannel。
IoGetDmaAdapter によって返されるアダプター オブジェクト ポインターは、Irp->MdlAddress で渡される MDL へのポインターを必要とする KeFlushIoBuffers と MmGetMdlVirtualAddress を除く、これらの各ルーチンに必要なパラメーターです。
個々のドライバーは、各ドライバーがデバイスにサービスを提供するために実装される方法に応じて、さまざまなポイントでこの一連のサポート ルーチンを呼び出します。 たとえば、あるドライバーの StartIo ルーチンが AllocateAdapterChannel への呼び出しを行い、別のドライバーがドライバーによって作成されたインターロック キューから IRP を削除するルーチンからこの呼び出しを行う場合があります。また別のドライバーが、下位 DMA デバイスがデータを転送する準備ができていることを示す際に、この呼び出しを行う場合があります。