WdfDmaTransactionDmaCompletedWithLength-Funktion (wdfdmatransaction.h)
[Gilt nur für KMDF]
Die WdfDmaTransactionDmaCompletedWithLength-Methode benachrichtigt das Framework, dass der DMA-Übertragungsvorgang eines Geräts abgeschlossen ist, und gibt die Länge der abgeschlossenen Übertragung an.
Syntax
BOOLEAN WdfDmaTransactionDmaCompletedWithLength(
[in] WDFDMATRANSACTION DmaTransaction,
[in] size_t TransferredLength,
[out] NTSTATUS *Status
);
Parameter
[in] DmaTransaction
Ein Handle für ein DMA-Transaktionsobjekt, das der Treiber aus einem vorherigen Aufruf von WdfDmaTransactionCreate abgerufen hat.
[in] TransferredLength
Die Anzahl der Bytes, die das Gerät in der aktuellen DMA-Übertragung übertragen hat.
[out] Status
Ein Zeiger auf eine Position, die die status der DMA-Übertragung empfängt. Weitere Informationen finden Sie im Abschnitt Hinweise zu WdfDmaTransactionDmaCompleted.
Rückgabewert
WdfDmaTransactionDmaCompletedWithLength gibt FALSE zurück, und Status empfängt STATUS_MORE_PROCESSING_REQUIRED, wenn zusätzliche Übertragungen erforderlich sind, um die DMA-Transaktion abzuschließen. Die Methode gibt TRUE zurück, wenn keine zusätzlichen Übertragungen erforderlich sind.
Eine Fehlerüberprüfung tritt auf, wenn der Treiber ein ungültiges Objekthandle bereitstellt.
Hinweise
Wenn Ihr Treiber die WdfDmaTransactionDmaCompletedWithLength-Methode aufruft , beendet das Framework die aktuelle Übertragung und startet bei Bedarf eine neue.
Die WdfDmaTransactionDmaCompletedWithLength-Methode verhält sich wie WdfDmaTransactionDmaCompleted, mit der Ausnahme, dass Treiber WdfDmaTransactionDmaCompletedWithLength für Geräte aufrufen, die die Anzahl der übertragenen Bytes melden. Das Framework verwendet die gemeldete Byteanzahl, um den Beginn der nächsten DMA-Übertragung für die angegebene DMA-Transaktion zu bestimmen, wenn mehrere Übertragungen erforderlich sind, um die Transaktion abzuschließen.
Weitere Informationen zum Abschließen von DMA-Übertragungen finden Sie unter Abschließen einer DMA-Übertragung.
Beispiele
Das folgende Codebeispiel stammt aus dem PLX9x5x-Beispieltreiber . In diesem Beispiel wird WdfDmaTransactionGetCurrentDmaTransferLength aufgerufen, um die ursprüngliche Länge der aktuellen Übertragung zu bestimmen, und dann wird die tatsächliche Übertragungslänge berechnet. Als Nächstes ruft das Beispiel WdfDmaTransactionDmaCompletedWithLength auf, um die tatsächliche Übertragungslänge an das Framework zu melden. Wenn die aktuelle Übertragung die letzte für die Transaktion ist, ruft das Beispiel eine private Routine auf, die die E/A-Anforderung abschließt.
BOOLEAN hasTransitioned;
PDMA_TRANSFER_ELEMENT dteVA;
ULONG length;
//
// Use "DMA Clear-Count Mode" to get the complementary
// transferred byte count.
//
length = WdfDmaTransactionGetCurrentDmaTransferLength(dmaTransaction);
dteVA = (PDMA_TRANSFER_ELEMENT) devExt->ReadCommonBufferBase;
while(dteVA->DescPtr.LastElement == FALSE) {
length -= dteVA->TransferSize;
dteVA++;
}
length -= dteVA->TransferSize;
//
// Indicate that this DMA operation has completed.
//
hasTransitioned =
WdfDmaTransactionDmaCompletedWithLength(
dmaTransaction,
length,
&status
);
if (hasTransitioned) {
//
// Complete this DMA transaction.
//
devExt->CurrentReadDmaTransaction = NULL;
PLxReadRequestComplete(
dmaTransaction,
status
);
}
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform | Universell |
KMDF-Mindestversion | 1.0 |
Kopfzeile | wdfdmatransaction.h (einschließen von Wdf.h) |
Bibliothek | Wdf01000.sys (siehe Versionierung der Frameworkbibliothek.) |
IRQL | <=DISPATCH_LEVEL |
DDI-Complianceregeln | DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf) |