Reservando recursos de DMA

[Aplica-se somente ao KMDF]

Normalmente, os drivers baseados em estrutura não reservam registros de mapa antecipadamente. No entanto, em determinadas circunstâncias, os drivers podem precisar reservar esses recursos com antecedência.

Drivers baseados em estrutura em execução em Windows 8 ou posterior podem reservar um número especificado de registros de mapa para um habilitador de DMA que especifica um perfil de pacote ou sistema. Para fazer isso, o driver chama WdfDmaTransactionAllocateResources e registra uma função de retorno de chamada EvtReserveDma .

A estrutura chama a função EvtReserveDma do driver quando reserva os registros de mapa e o bloqueio do adaptador de DMA do WDM. Em seguida, o driver pode inicializar e iniciar a transação várias vezes usando o mesmo objeto de transação antes de finalmente liberar o objeto de transação. Para liberar os recursos de DMA de volta para o sistema, o driver chama WdfDmaTransactionFreeResources.

Para determinar o número de registros de mapa necessários para uma transação, o driver pode chamar WdfDmaTransactionGetTransferInfo antes de chamar WdfDmaTransactionAllocateResources. O driver deve inicializar a transação antes de chamar WdfDmaTransactionGetTransferInfo.

As etapas a seguir demonstram como um driver pode reservar e liberar um habilitador de DMA para uso exclusivo com uma transação especificada:

  1. O driver recebe uma solicitação de E/S.

  2. O manipulador de solicitação do driver chama WdfDmaTransactionCreate para criar um objeto de transação DMA para a solicitação.

  3. O manipulador de solicitação do driver chama WdfDmaTransactionAllocateResources para reservar recursos.

  4. A estrutura chama EvtReserveDma quando reserva os recursos solicitados.

  5. Em EvtReserveDma, o driver chama WdfDmaTransactionInitializeUsingRequest ou WdfDmaTransactionInitialize para inicializar o objeto de transação.

  6. Em EvtReserveDma, o driver chama o método WdfDmaTransactionExecute para iniciar a transação. Como a transação tem recursos reservados, a estrutura chama imediatamente a função de retorno de chamada EvtProgramDma do driver.

  7. De EvtInterruptDpc ou EvtDmaTransactionDmaTransferComplete, o driver chama WdfDmaTransactionDmaCompleted, WdfDmaTransactionDmaCompletedWithLength ou WdfDmaTransactionDmaCompletedFinal, seguido por WdfObjectDelete ou WdfDmaTransactionRelease. O driver não deve excluir ou liberar a transação até que a transação seja concluída ou cancelada. Após a conclusão desta etapa, os registros de mapa permanecem reservados.

  8. O driver pode repetir as etapas de 5 a 7 quantas vezes forem necessárias.

    Quando o driver não precisa mais da reserva, o driver chama WdfDmaTransactionFreeResources de EvtInterruptDpc ou EvtDmaTransactionDmaTransferComplete. Como alternativa, o driver pode chamar WdfDmaTransactionFreeResources de sua função de retorno de chamada de evento EvtReserveDma .