Concluindo uma transação de DMA
[Aplica-se somente ao KMDF]
Cada vez que o dispositivo de um driver conclui uma transferência de DMA, o driver deve chamar WdfDmaTransactionDmaCompleted, WdfDmaTransactionDmaCompletedWithLength ou WdfDmaTransactionDmaCompletedFinal e, em seguida, marcar o valor retornado.
Quando o valor retornado é TRUE, não são necessárias mais transferências para a transação de DMA e o driver deve concluir a transação de DMA. Normalmente, o driver ainda não retornou de sua função de retorno de chamada EvtInterruptDpc . Portanto, essa função de retorno de chamada conclui a transação de AMD:
Chamar WdfObjectDelete para excluir o objeto de transação ou chamar WdfDmaTransactionRelease se o driver reutilizar objetos de transação DMA.
Chamar WdfRequestComplete ou WdfRequestCompleteWithInformation, se a transação estiver associada a um objeto de solicitação de estrutura.
Se o driver chamar WdfRequestCompleteWithInformation, ele normalmente chama WdfDmaTransactionGetBytesTransferred para obter o comprimento total (número de bytes) de todas as transferências da transação.
Essas etapas são ilustradas no exemplo de código a seguir, obtido da função de retorno de chamada EvtInterruptDpc do exemplo PLX9x5x no arquivo 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);
}
}