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:
Chiamata di WdfObjectDelete per eliminare l'oggetto transazione o chiamare WdfDmaTransactionRelease se il driver riutilizza gli oggetti transazioni DMA.
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);
}
}