DMA リソースの予約

[KMDF にのみ適用]

通常、フレームワーク ベースのドライバーは、マップ レジスタを事前に予約しません。 ただし、状況によっては、ドライバーが事前にこれらのリソースを予約する必要がある場合があります。

Windows 8 以降で実行されているフレームワーク ベースのドライバーは、パケットまたはシステム プロファイルを指定する DMA イネーブラーのために指定された数のマップ レジスタを予約できます。 これを行うために、ドライバーは WdfDmaTransactionAllocateResources を呼び出し、EvtReserveDma コールバック関数を登録します。

フレームワークは、マップ レジスタと WDM DMA アダプターのロックを予約しているときに、ドライバーの EvtReserveDma 関数を呼び出します。 その後、ドライバーは、トランザクション オブジェクトを最後に解放する前に、同じトランザクション オブジェクトを使用してトランザクションを複数回初期化して開始できます。 DMA リソースをシステムに解放するために、ドライバーは WdfDmaTransactionFreeResources を呼び出します。

トランザクションに必要なマップ レジスタの数を確認するために、ドライバーは WdfDmaTransactionAllocateResources を呼び出す前に WdfDmaTransactionGetTransferInfo を呼び出すことができます。 ドライバーは、WdfDmaTransactionGetTransferInfo を呼び出す前にトランザクションを初期化する必要があります。

次の手順では、ドライバーが予約し、指定したトランザクションで排他的に使用する DMA イネーブラーを解放する方法を示します。

  1. ドライバーは I/O 要求を受け取ります。

  2. ドライバーの要求ハンドラーは、要求の DMA トランザクション オブジェクトを作成する WdfDmaTransactionCreate を呼び出します。

  3. ドライバーの要求ハンドラーは、WdfDmaTransactionAllocateResources を呼び出してリソースを予約します。

  4. フレームワークは、要求されたリソースを予約したときに EvtReserveDma を呼び出します。

  5. EvtReserveDma では、ドライバーは WdfDmaTransactionInitializeUsingRequest または WdfDmaTransactionInitialize を呼び出してトランザクション オブジェクトを初期化します。

  6. EvtReserveDma では、ドライバーは WdfDmaTransactionExecute メソッドを呼び出してトランザクションを開始します。 トランザクションには予約済みのリソースがあるため、フレームワークはドライバーの EvtProgramDma コールバック関数を直ちに呼び出します。

  7. EvtInterruptDpc または EvtDmaTransactionDmaTransferComplete より、ドライバーは、 WdfDmaTransactionDmaCompletedWdfDmaTransactionDmaCompletedWithLength、または WdfDmaTransactionDmaCompletedFinal を呼び出し、その後に WdfObjectDelete または WdfDmaTransactionRelease を呼び出します。 ドライバーは、トランザクションが完了または取り消されるまで、トランザクションを削除または解放することはできません。 この手順が完了した後も、マップ レジスタは予約されたままとなります。

  8. ドライバーは、手順 5-7 を必要な回数繰り返すことができます。

    ドライバーが予約を必要としなくなると、ドライバーは、EvtInterruptDpc または EvtDmaTransactionDmaTransferComplete から WdfDmaTransactionFreeResources を呼び出します。 または、ドライバーは、EvtReserveDma イベント コールバック関数から WdfDmaTransactionFreeResources を呼び出すことができます。