次の方法で共有


DMA トランザクションの完了

[KMDF のみに適用]

ドライバーのデバイスが DMA 転送を完了するたびに、ドライバーは WdfDmaTransactionDmaCompletedWdfDmaTransactionDmaCompletedWithLength、または WdfDmaTransactionDmaCompletedFinal を呼び出し、戻り値をチェックする必要があります。

戻り値が TRUE の場合、DMA トランザクションの転送は不要になり、ドライバーは DMA トランザクションを完了する必要があります。 通常、ドライバーは EvtInterruptDpc コールバック関数からまだ返っていません。 したがってこのコールバック関数は、次の方法で DMA トランザクションを完了します。

  1. WdfObjectDelete を呼び出してトランザクション オブジェクトを削除するか、ドライバーが DMA トランザクション オブジェクトを再利用する場合は WdfDmaTransactionRelease を呼び出します。

  2. トランザクションがフレームワーク要求オブジェクトに関連付けられている場合は、WdfRequestComplete または WdfRequestCompleteWithInformation を呼び出します。

ドライバーが WdfRequestCompleteWithInformation を呼び出す場合、通常は最初に WdfDmaTransactionGetBytesTransferred を呼び出して、トランザクションのすべての転送の合計長 (バイト数) を取得します。

これらの手順は、Isrdpc.c ファイルの PLX9x5x サンプルの EvtInterruptDpc コールバック関数から取得した次のコード例に示されています。

if (readComplete) {
    BOOLEAN              transactionComplete;
    WDFDMATRANSACTION    dmaTransaction;
    size_t               bytesTransferred;

    // Get the current Read DmaTransaction.
    dmaTransaction = devExt->CurrentReadDmaTransaction;

    // Indicate that this DMA operation has completed:
    // This may start the transfer on the next packet if 
    // there is still data to be transferred.
    transactionComplete = 
          WdfDmaTransactionDmaCompleted( dmaTransaction, &status ); 
    if (transactionComplete) {
        // Complete the DmaTransaction and the request.
        devExt->CurrentReadDmaTransaction = NULL;
        bytesTransferred =  
               ((NT_SUCCESS(status)) ? 
               WdfDmaTransactionGetBytesTransferred(dmaTransaction): 0 );
        WdfDmaTransactionRelease(dmaTransaction);
        WdfRequestCompleteWithInformation(request, status, bytesTransferred);
    }
}