Freigeben über


Abschließen einer DMA-Transaktion

[Gilt nur für KMDF]

Jedes Mal, wenn das Gerät eines Treibers eine DMA-Übertragung abgeschlossen hat, muss der Treiber WdfDmaTransactionDmaCompleted, WdfDmaTransactionDmaCompletedWithLength oder WdfDmaTransactionDmaCompletedFinal aufrufen und dann den Rückgabewert überprüfen.

Wenn der Rückgabewert TRUE ist, sind keine weiteren Übertragungen für die DMA-Transaktion erforderlich, und der Treiber muss die DMA-Transaktion abschließen. In der Regel wurde der Treiber noch nicht von seiner EvtInterruptDpc-Rückruffunktion zurückgegeben. Daher schließt diese Rückruffunktion die DMA-Transaktion wie folgt ab:

  1. Aufrufen von WdfObjectDelete zum Löschen des Transaktionsobjekts oder Aufrufen von WdfDmaTransactionRelease , wenn der Treiber DMA-Transaktionsobjekte wiederverwendet.

  2. Aufrufen von WdfRequestComplete oder WdfRequestCompleteWithInformation, wenn die Transaktion einem Frameworkanforderungsobjekt zugeordnet ist.

Wenn der Treiber WdfRequestCompleteWithInformation aufruft, ruft er in der Regel zuerst WdfDmaTransactionGetBytesTransferred auf, um die Gesamtlänge (Anzahl der Bytes) aller Übertragungen der Transaktion abzurufen.

Diese Schritte werden im folgenden Codebeispiel veranschaulicht, das aus der EvtInterruptDpc-Rückruffunktion des PLX9x-Beispiels in der Datei Isrdpc.c stammt:

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