Partager via


WdfDmaTransactionDmaCompletedWithLength, fonction (wdfdmatransaction.h)

[S’applique à KMDF uniquement]

La méthode WdfDmaTransactionDmaCompletedWithLength informe l’infrastructure que l’opération de transfert DMA d’un appareil est terminée et fournit la durée du transfert terminé.

Syntaxe

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

Paramètres

[in] DmaTransaction

Handle pour un objet de transaction DMA que le pilote a obtenu à partir d’un appel précédent à WdfDmaTransactionCreate.

[in] TransferredLength

Nombre d’octets transférés par l’appareil dans le transfert DMA actuel.

[out] Status

Pointeur vers un emplacement qui reçoit le status du transfert DMA. Pour plus d’informations, consultez la section Notes pour WdfDmaTransactionDmaCompleted.

Valeur retournée

WdfDmaTransactionDmaCompletedWithLength retourne FALSE et Status reçoit STATUS_MORE_PROCESSING_REQUIRED si des transferts supplémentaires sont nécessaires pour terminer la transaction DMA. La méthode retourne TRUE si aucun transfert supplémentaire n’est requis.

Un bogue case activée se produit si le pilote fournit un handle d’objet non valide.

Remarques

Lorsque votre pilote appelle la méthode WdfDmaTransactionDmaCompletedWithLength , l’infrastructure met fin au transfert actuel et, si nécessaire, en démarre un nouveau.

La méthode WdfDmaTransactionDmaCompletedWithLength se comporte de la même façon que WdfDmaTransactionDmaCompleted, sauf que les pilotes appellent WdfDmaTransactionDmaCompletedWithLength pour les appareils qui signalent le nombre d’octets transférés. L’infrastructure utilise le nombre d’octets signalé pour déterminer le début du prochain transfert DMA pour la transaction DMA spécifiée, si plusieurs transferts sont nécessaires pour terminer la transaction.

Pour plus d’informations sur l’exécution des transferts DMA, consultez Achèvement d’un transfert DMA.

Exemples

L’exemple de code suivant provient de l’exemple de pilote PLX9x5x . Cet exemple appelle WdfDmaTransactionGetCurrentDmaTransferLength pour déterminer la longueur d’origine du transfert actuel, puis calcule la longueur de transfert réelle. Ensuite, l’exemple appelle WdfDmaTransactionDmaCompletedWithLength pour signaler la longueur de transfert réelle à l’infrastructure. Si le transfert actuel est le dernier pour la transaction, l’exemple appelle une routine privée qui termine la demande d’E/S.

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

Configuration requise

Condition requise Valeur
Plateforme cible Universal
Version KMDF minimale 1.0
En-tête wdfdmatransaction.h (inclure Wdf.h)
Bibliothèque Wdf01000.sys (consultez Gestion des versions de la bibliothèque d’infrastructure).)
IRQL <=DISPATCH_LEVEL
Règles de conformité DDI DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)

Voir aussi

WdfDmaTransactionCreate

WdfDmaTransactionDmaCompleted

WdfDmaTransactionGetCurrentDmaTransferLength