Compartilhar via


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:

  1. Chamar WdfObjectDelete para excluir o objeto de transação ou chamar WdfDmaTransactionRelease se o driver reutilizar objetos de transação DMA.

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