Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
[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:
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.
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);
}
}