パケットベース バス マスター DMA の使用
パケット ベース DMA を使用するため、バス マスター DMA デバイスのドライバーは、DMA 転送を要求する IRP を処理する次の一般的な一連のサポート ルーチンを呼び出します。
転送要求にマップ レジスタを割り当てようとする直前の KeFlushIoBuffers。(詳細については、キャッシュの一貫性の維持を参照)
ドライバーが DMA バス マスター アダプターをプログラミングする準備ができた場合の AllocateAdapterChannel。
MDL にインデックスを取得する場合の初期パラメーターとして必要な MmGetMdlVirtualAddress。これは、IRP のバッファー デバイスをサポートするシステム物理メモリにアクセスできるようにするために MapTransfer および MapTransfer に必要です。
転送要求の分割で説明されているように、現在の IRP を満たすために、ドライバーが複数の転送操作を実行する必要がある場合があることに注意する必要があります。 散布図/収集機能を持たないデバイスのドライバーは、転送操作ごとに 1 回、MapTransfer を呼び出すことができます。 散布図/収集機能を持つデバイスのドライバーは、MapTransfer を複数回呼び出して、各転送操作を設定できます。 または、散布図/収集 DMA の使用で説明されているように、システムの組み込みの散布図/収集サポートを使用することもできます。
要求されたすべてのデータが完全に転送されたかどうかを判断するための、ターゲット デバイス間の各 DMA 転送操作の終了時の FlushAdapterBuffers。
要求されたすべてのデータが完全に転送されたか、デバイスまたはバスの I/O エラーが原因でドライバーが IRP に失敗しなければならなかったために、現在の IRP のすべての DMA 操作が完了した場合の FreeMapRegisters。
IoGetDmaAdapter によって返されるアダプター オブジェクト ポインターは、AllocateAdapterChannel、MapTransfer、FlushAdapterBuffers、FreeMapRegisters に必要なパラメーターです。 Windows 2000 より前のバージョンの Windows NT では、バス マスター デバイスが MAPTransfer および FlushAdapterBuffers に NULL アダプター オブジェクト ポインターを渡す場合があることに注意する必要があります。 Windows 2000 以降では、ドライバーではこれを行うことはできません。
KeFlushIoBuffers と MmGetMdlVirtualAddress には、Irp->MdlAddress の MDL へのポインターが必要です。
個々のドライバーは、各ドライバーがデバイスにサービスを提供するために実装される方法に応じて、さまざまなポイントでこの一連のサポート ルーチンを呼び出します。 たとえば、あるドライバーの StartIo ルーチンが AllocateAdapterChannel を呼び出し、別のドライバーがドライバーによって作成されたインターロック されたキューまたはデバイス キューから IRP を削除するルーチンからこの呼び出しを行う場合があります。
このセクションで説明したルーチンを使用する代わりに、パケット ベースの DMA を使用するドライバーは、デバイスに散布図/収集のサポートが組み込まれているかどうかに関係なく、DMA の分散/収集を効率化するためのサポート ルーチンを使用できます。 詳細については、散布図/収集 DMA の使用を参照してください。