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

Weitere Informationen

WdfDmaTransactionCreate

WdfDmaTransactionDmaCompleted

WdfDmaTransactionGetCurrentDmaTransferLength