Megosztás a következőn keresztül:


DMA-tranzakció végrehajtása

[Csak KMDF-re vonatkozik]

Minden alkalommal, amikor egy illesztőprogram eszköze DMA-átvitelt végez, az illesztőprogramnak meghívnia kell a WdfDmaTransactionDmaCompleted, a WdfDmaTransactionDmaCompletedWithLength vagy a WdfDmaTransactionDmaCompletedFinal parancsot , majd ellenőriznie kell a visszatérési értéket.

Ha a visszatérési érték IGAZ, a DMA-tranzakcióhoz nincs szükség további átvitelre, és az illesztőnek végre kell hajtania a DMA-tranzakciót. Az illesztőprogram általában még nem tért vissza az EvtInterruptDpc visszahívási függvényéből. Ezért ez a visszahívási függvény a következő módon hajtja végre a DMA-tranzakciót:

  1. A WdfObjectDelete meghívásával törölheti a tranzakcióobjektumot, vagy meghívhatja a WdfDmaTransactionRelease parancsot, ha az illesztőprogram újra felhasználja a DMA tranzakcióobjektumokat.

  2. A WdfRequestComplete vagy a WdfRequestCompleteWithInformation meghívása, ha a tranzakció egy keretrendszer-kérelemobjektumhoz van társítva.

Ha az illesztőprogram meghívja a WdfRequestCompleteWithInformation parancsot, általában először meghívja a WdfDmaTransactionGetBytesTransferred függvényt a tranzakció összes átvitelének teljes hosszának (bájtszámának) lekéréséhez.

Ezeket a lépéseket a következő kódpéldában szemléltetjük, amely a PLX9x5x minta EvtInterruptDpc visszahívási függvényéből származik az Isrdpc.c fájlban:

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