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)

Consulte también

WdfDmaTransactionCreate

WdfDmaTransactionDmaCompleted

WdfDmaTransactionGetCurrentDmaTransferLength