Menyelesaikan Transaksi DMA

[Hanya berlaku untuk KMDF]

Setiap kali perangkat driver menyelesaikan transfer DMA, driver harus memanggil WdfDmaTransactionDmaCompleted, WdfDmaTransactionDmaCompletedWithLength, atau WdfDmaTransactionDmaCompletedFinal lalu memeriksa nilai pengembalian.

Ketika nilai pengembalian TRUE, tidak ada lagi transfer yang diperlukan untuk transaksi DMA dan driver harus menyelesaikan transaksi DMA. Biasanya, driver belum kembali dari fungsi panggilan balik EvtInterruptDpc . Oleh karena itu, fungsi panggilan balik ini menyelesaikan transaksi DMA dengan:

  1. Memanggil WdfObjectDelete untuk menghapus objek transaksi, atau memanggil WdfDmaTransactionRelease jika driver menggunakan kembali objek transaksi DMA.

  2. Memanggil WdfRequestComplete atau WdfRequestCompleteWithInformation, jika transaksi dikaitkan dengan objek permintaan kerangka kerja.

Jika driver memanggil WdfRequestCompleteWithInformation, biasanya pertama-tama memanggil WdfDmaTransactionGetBytesTransferred untuk mendapatkan panjang total (jumlah byte) dari semua transfer transaksi.

Langkah-langkah ini diilustrasikan dalam contoh kode berikut, yang diambil dari fungsi panggilan balik EvtInterruptDpc sampel PLX9x5x dalam file Isrdpc.c:

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);
    }
}