Cancelando transações de DMA

[Aplica-se somente a KMDF]

se o driver tiver sido criado com a versão 1,11 ou uma versão posterior do KMDF e estiver em execução no Windows 8 ou posterior usando o DMA (acesso direto à memória) versão 3, o driver poderá tentar cancelar uma transação DMA pendente chamando o método WdfDmaTransactionCancel .

Ao chamar WdfDmaTransactionCancel, o driver deve garantir que a transação DMA especificada não seja concluída durante a chamada. O driver pode usar a técnica a seguir para cancelar com segurança uma transação, seja antes da alocação de canal DMA ou depois que algumas operações de transferência já tiverem sido concluídas:

  1. Em um dos manipuladores de solicitaçãodo driver, o driver chama WdfRequestMarkCancelableEx e fornece uma função de retorno de chamada EvtRequestCancel para a solicitação de e/s. O manipulador de solicitação então chama WdfDmaTransactionExecute.

  2. A função de retorno de chamada EvtRequestCancel do driver (que pode começar a ser executada em um thread separado imediatamente após a chamada para WdfRequestMarkCancelableEx) chama WdfDmaTransactionCancel.

  3. Se a chamada para WdfDmaTransactionCancel ocorrer após a chamada para WdfDmaTransactionExecute, mas antes de o método WDFDMATRANSACTIONEXECUTE ter iniciado a alocação DMA, o cancelamento da transação será bem sucedido e WdfDmaTransactionCancel retornará true. Nesse caso, a função de retorno de chamada EvtRequestCancel do driver deve concluir a transação DMA. WdfDmaTransactionExecute retorna um valor de erro.

  4. Se o driver chamar WdfDmaTransactionCancel depois que o método WdfDmaTransactionExecute tiver iniciado a alocação DMA, a tentativa de cancelar a transação falhará e WdfDmaTransactionCancel retornará false. Nesse caso, WdfDmaTransactionExecute retorna STATUS_SUCCESS e o manipulador de solicitação do driver deve concluir a transação DMA.

    Neste ponto, se o driver estiver usando o DMA do modo de sistema, a função de retorno de chamada EvtRequestCancel poderá chamar WdfDmaTransactionStopSystemTransfer para tentar interromper a transferência de DMA em andamento do modo do sistema. Para obter um exemplo de código que mostra como fazer isso, consulte WdfDmaTransactionStopSystemTransfer.

  5. Depois que o método WdfDmaTransactionExecute conclui a alocação DMA, a estrutura chama a função de retorno de chamada EvtProgramDma do driver (que pode começar a ser executada em um thread separado imediatamente após a chamada para WdfDmaTransactionExecute). Neste ponto, uma chamada para o método WdfDmaTransactionCancel retornaria false.

    No EvtProgramDma, o driver pode chamar WdfRequestUnmarkCancelable para encerrar a possibilidade de cancelamento de solicitação. Se WdfRequestUnmarkCancelable retornar STATUS_SUCCESS, a função de retorno de chamada deverá programar o hardware para iniciar a transferência. Se WdfRequestUnmarkCancelable retornar STATUS_CANCELLED, a solicitação foi cancelada. Nesse caso, EvtProgramDma deve chamar WdfDmaTransactionDmaCompletedFinal para concluir a transação DMA.

    O driver pode usar a mesma técnica para cancelar uma transação DMA depois que algum número de operações de transferência já tiver sido concluído. Nesse caso, o driver chama WdfDmaTransactionCancel depois de chamar WdfDmaTransactionDmaCompleted, mas antes que a estrutura chame EvtProgramDma para programar a próxima operação de transferência. Se o driver for chamar WdfDmaTransactionCancel antes de chamar WdfDmaTransactionDmaCompleted, WdfDmaTransactionDmaCompleted retornará true, indicando que a transação DMA foi concluída.