Función WdfDmaTransactionDmaCompletedWithLength (wdfdmatransaction.h)
[Solo se aplica a KMDF]
El método WdfDmaTransactionDmaCompletedWithLength notifica al marco que la operación de transferencia DMA de un dispositivo está completa y proporciona la longitud de la transferencia completada.
Sintaxis
BOOLEAN WdfDmaTransactionDmaCompletedWithLength(
[in] WDFDMATRANSACTION DmaTransaction,
[in] size_t TransferredLength,
[out] NTSTATUS *Status
);
Parámetros
[in] DmaTransaction
Identificador de un objeto de transacción DMA que el controlador obtuvo de una llamada anterior a WdfDmaTransactionCreate.
[in] TransferredLength
Número de bytes que el dispositivo transfirió en la transferencia DMA actual.
[out] Status
Puntero a una ubicación que recibe el estado de la transferencia DMA. Para obtener más información, vea la sección Comentarios de WdfDmaTransactionDmaCompleted.
Valor devuelto
WdfDmaTransactionDmaCompletedWithLength devuelve FALSE y Status recibe STATUS_MORE_PROCESSING_REQUIRED si se necesitan transferencias adicionales para completar la transacción DMA. El método devuelve TRUE si no se requieren transferencias adicionales.
Se produce una comprobación de errores si el controlador proporciona un identificador de objeto no válido.
Comentarios
Cuando el controlador llama al método WdfDmaTransactionDmaCompletedWithLength , el marco finaliza la transferencia actual y, si es necesario, inicia uno nuevo.
El método WdfDmaTransactionDmaCompletedWithLength se comporta igual que WdfDmaTransactionDmaCompleted, excepto que los controladores llaman a WdfDmaTransactionDmaCompletedWithLength para los dispositivos que informan del número de bytes transferidos. El marco usa el recuento de bytes notificado para determinar el principio de la siguiente transferencia de DMA para la transacción DMA especificada, si se necesitan varias transferencias para completar la transacción.
Para obtener más información sobre cómo completar las transferencias de DMA, consulte Finalización de una transferencia de DMA.
Ejemplos
El ejemplo de código siguiente es del controlador de ejemplo PLX9x5x . En este ejemplo se llama a WdfDmaTransactionGetCurrentDmaTransferLength para determinar la longitud original de la transferencia actual y, a continuación, calcula la longitud real de la transferencia. A continuación, el ejemplo llama a WdfDmaTransactionDmaCompletedWithLength para notificar la longitud de transferencia real al marco. Si la transferencia actual es la última para la transacción, el ejemplo llama a una rutina privada que completa la solicitud de 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
);
}
Requisitos
Requisito | Value |
---|---|
Plataforma de destino | Universal |
Versión mínima de KMDF | 1.0 |
Encabezado | wdfdmatransaction.h (incluya Wdf.h) |
Library | Wdf01000.sys (consulte Control de versiones de la biblioteca de marcos). |
IRQL | <=DISPATCH_LEVEL |
Reglas de cumplimiento de DDI | DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf) |