Partager via


WdfDmaTransactionDmaCompletedWithLength, fonction (wdfdmatransaction.h)

[S’applique uniquement à KMDF]

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

Syntaxe

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

Paramètres

[in] DmaTransaction

Handle vers 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 l’état du transfert DMA. Pour plus d’informations, consultez la section Notes pour WdfDmaTransactionDmaCompleted.

Valeur de retour

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 nécessaire.

Une vérification de bogue 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, le cas échéant, 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 transfert DMA suivant pour la transaction DMA spécifiée, si plusieurs transferts sont nécessaires pour terminer la transaction.

Pour plus d’informations sur la fin des transferts DMA, consultez Fin d’unde 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 réelle du transfert. Ensuite, l’exemple appelle WdfDmaTransactionDmaCompletedWithLength pour signaler la longueur de transfert réelle au framework. Si le transfert actuel est le dernier de la transaction, l’exemple appelle une routine privée qui termine la requête 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
                           );
}

Spécifications

Besoin Valeur
plateforme cible Universel
version minimale de KMDF 1.0
En-tête wdfdmatransaction.h (include Wdf.h)
Bibliothèque Wdf01000.sys (voir Versioning de la bibliothèque Framework.)
IRQL <=DISPATCH_LEVEL
règles de conformité DDI DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)

Voir aussi

WdfDmaTransactionCreate

WdfDmaTransactionDmaCompleted

WdfDmaTransactionGetCurrentDmaTransferLength