Função WdfDmaTransactionDmaCompletedWithLength (wdfdmatransaction.h)

[Aplica-se somente ao KMDF]

O método WdfDmaTransactionDmaCompletedWithLength notifica a estrutura de que a operação de transferência de DMA de um dispositivo está concluída e fornece o comprimento da transferência concluída.

Sintaxe

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

Parâmetros

[in] DmaTransaction

Um identificador para um objeto de transação DMA que o driver obteve de uma chamada anterior para WdfDmaTransactionCreate.

[in] TransferredLength

O número de bytes transferidos pelo dispositivo na transferência de DMA atual.

[out] Status

Um ponteiro para um local que recebe o status da transferência de DMA. Para obter mais informações, consulte a seção Comentários para WdfDmaTransactionDmaCompleted.

Retornar valor

WdfDmaTransactionDmaCompletedWithLength retorna FALSE e Status recebe STATUS_MORE_PROCESSING_REQUIRED se forem necessárias transferências adicionais para concluir a transação de DMA. O método retornará TRUE se nenhuma transferência adicional for necessária.

Um bug marcar ocorrerá se o driver fornecer um identificador de objeto inválido.

Comentários

Quando o driver chama o método WdfDmaTransactionDmaCompletedWithLength , a estrutura encerra a transferência atual e, se necessário, inicia uma nova.

O método WdfDmaTransactionDmaCompletedWithLength se comporta da mesma forma que WdfDmaTransactionDmaCompleted, exceto que os drivers chamam WdfDmaTransactionDmaCompletedWithLength para dispositivos que relatam o número de bytes transferidos. A estrutura usa a contagem de bytes relatada para determinar o início da próxima transferência de DMA para a transação de DMA especificada, se várias transferências forem necessárias para concluir a transação.

Para obter mais informações sobre como concluir transferências de DMA, consulte Concluindo uma transferência de DMA.

Exemplos

O exemplo de código a seguir é do driver de exemplo PLX9x5x . Este exemplo chama WdfDmaTransactionGetCurrentDmaTransferLength para determinar o comprimento original da transferência atual e, em seguida, calcula o comprimento real da transferência. Em seguida, o exemplo chama WdfDmaTransactionDmaCompletedWithLength para relatar o comprimento real da transferência para a estrutura. Se a transferência atual for a última para a transação, o exemplo chamará uma rotina privada que conclui a solicitação 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 Valor
Plataforma de Destino Universal
Versão mínima do KMDF 1.0
Cabeçalho wdfdmatransaction.h (inclua Wdf.h)
Biblioteca Wdf01000.sys (consulte Controle de versão da biblioteca de estrutura.)
IRQL <=DISPATCH_LEVEL
Regras de conformidade de DDI DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)

Confira também

WdfDmaTransactionCreate

WdfDmaTransactionDmaCompleted

WdfDmaTransactionGetCurrentDmaTransferLength