Completamento di una transazione DMA

[Si applica solo a KMDF]

Ogni volta che il dispositivo di un driver completa un trasferimento DMA, il driver deve chiamare WdfDmaTransactionDmaCompleted, WdfDmaTransactionDmaCompletedWithLength o WdfDmaTransactionDmaCompletedFinal e quindi controllare il valore restituito.

Quando il valore restituito è TRUE, non sono necessari più trasferimenti per la transazione DMA e il driver deve completare la transazione DMA. In genere, il driver non ha ancora restituito dalla sua funzione di callback EvtInterruptDpc . Pertanto, questa funzione di callback completa la transazione DMA per:

  1. Chiamata di WdfObjectDelete per eliminare l'oggetto transazione o chiamare WdfDmaTransactionRelease se il driver riutilizza gli oggetti transazioni DMA.

  2. Chiamata di WdfRequestComplete o WdfRequestCompleteWithInformation, se la transazione è associata a un oggetto richiesta framework.

Se il driver chiama WdfRequestCompleteWithInformation, in genere chiama WdfDmaTransactionGetBytesTransferred per ottenere la lunghezza totale (numero di byte) di tutti i trasferimenti della transazione.

Questi passaggi sono illustrati nell'esempio di codice seguente, tratto dalla funzione di callback EvtInterruptDpc dell'esempio PLX9x5x5x nel 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);
    }
}