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