Funzione WdfDmaTransactionDmaCompletedWithLength (wdfdmatransaction.h)

[Si applica solo a KMDF]

Il metodo WdfDmaTransactionDmaCompletedWithLength notifica al framework che l'operazione di trasferimento DMA di un dispositivo è stata completata e fornisce la lunghezza del trasferimento completato.

Sintassi

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

Parametri

[in] DmaTransaction

Handle per un oggetto transazione DMA ottenuto dal driver da una chiamata precedente a WdfDmaTransactionCreate.

[in] TransferredLength

Numero di byte trasferiti dal dispositivo nel trasferimento DMA corrente.

[out] Status

Puntatore a una posizione che riceve lo stato del trasferimento DMA. Per altre informazioni, vedere la sezione Osservazioni per WdfDmaTransactionDmaCompleted.

Valore restituito

WdfDmaTransactionDmaCompletedWithLength restituisce FALSE e Status riceve STATUS_MORE_PROCESSING_REQUIRED se sono necessari trasferimenti aggiuntivi per completare la transazione DMA. Il metodo restituisce TRUE se non sono necessari trasferimenti aggiuntivi.

Se il driver fornisce un handle di oggetto non valido, si verifica un controllo di bug.

Commenti

Quando il driver chiama il metodo WdfDmaTransactionDmaCompletedWithLength , il framework termina il trasferimento corrente e, se necessario, avvia un nuovo metodo.

Il metodo WdfDmaTransactionDmaCompletedWithLength si comporta come WdfDmaTransactionDmaCompleted, ad eccezione del fatto che i driver chiamano WdfDmaTransactionDmaCompletedWithLength per i dispositivi che segnalano il numero di byte trasferiti. Il framework usa il conteggio dei byte segnalato per determinare l'inizio del successivo trasferimento DMA per la transazione DMA specificata, se sono necessari più trasferimenti per completare la transazione.

Per altre informazioni sul completamento dei trasferimenti DMA, vedere Completamento di un trasferimento DMA.

Esempio

L'esempio di codice seguente è tratto dal driver di esempio PLX9x5x5x . Questo esempio chiama WdfDmaTransactionGetCurrentDmaTransferLength per determinare la lunghezza originale del trasferimento corrente e quindi calcola la lunghezza effettiva del trasferimento. L'esempio chiama quindi WdfDmaTransactionDmaCompletedWithLength per segnalare la lunghezza effettiva del trasferimento al framework. Se il trasferimento corrente è l'ultimo per la transazione, nell'esempio viene chiamata una routine privata che completa la richiesta di I/O.

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

Requisiti

Requisito Valore
Piattaforma di destinazione Universale
Versione KMDF minima 1.0
Intestazione wdfdmatransaction.h (include Wdf.h)
Libreria Wdf01000.sys (vedere Controllo delle versioni della libreria framework).
IRQL <=DISPATCH_LEVEL
Regole di conformità DDI DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)

Vedi anche

WdfDmaTransactionCreate

WdfDmaTransactionDmaCompleted

WdfDmaTransactionGetCurrentDmaTransferLength