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