Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
[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) |