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