Freigeben über


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 die Länge der abgeschlossenen Übertragung bereitstellt.

Syntax

BOOLEAN WdfDmaTransactionDmaCompletedWithLength(
  [in]  WDFDMATRANSACTION DmaTransaction,
  [in]  size_t            TransferredLength,
  [out] NTSTATUS          *Status
);

Die Parameter

[in] DmaTransaction

Ein Handle für ein DMA-Transaktionsobjekt, das der Treiber aus einem vorherigen Aufruf von WdfDmaTransactionCreateabgerufen 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 den Status der DMA-Übertragung empfängt. Weitere Informationen finden Sie im Abschnitt "Hinweise" für WdfDmaTransactionDmaCompleted.

Rückgabewert

WdfDmaTransactionDmaCompletedWithLength gibt FALSE- zurück und Status erhält 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.

Wenn der Treiber ein ungültiges Objekthandle bereitstellt, tritt eine Fehlerüberprüfung auf.

Bemerkungen

Wenn Ihr Treiber die WdfDmaTransactionDmaCompletedWithLength--Methode aufruft, beendet das Framework die aktuelle Übertragung und startet ggf. eine neue.

Die WdfDmaTransactionDmaCompletedWithLength--Methode verhält sich genauso wie WdfDmaTransactionDmaCompleted, außer dass Treiber WdfDmaTransactionDmaCompletedWithLength für Geräte aufrufen, die die Anzahl der übertragenen Bytes melden. Das Framework verwendet die gemeldete Byteanzahl, um den Anfang 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 ermitteln und dann die tatsächliche Übertragungslänge zu berechnen. Anschließend 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
Minimale KMDF-Version 1.0
Kopfzeile wdfdmatransaction.h (include Wdf.h)
Bibliothek Wdf01000.sys (siehe Framework-Bibliotheksversionsverwaltung.)
IRQL <=DISPATCH_LEVEL
DDI-Complianceregeln DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)

Siehe auch

WdfDmaTransactionCreate

WdfDmaTransactionDmaCompleted-

WdfDmaTransactionGetCurrentDmaTransferLength