Configurando o modo de expedição para uma fila de E/S

Aviso

O UMDF 2 é a versão mais recente do UMDF e substitui o UMDF 1. Todos os novos drivers UMDF devem ser gravados usando UMDF 2. Nenhum novo recurso está sendo adicionado ao UMDF 1 e há suporte limitado para UMDF 1 em versões mais recentes do Windows 10. Drivers universais do Windows devem usar UMDF 2.

Os exemplos umdf 1 arquivados podem ser encontrados no Windows 11, versão 22H2 – Atualização de exemplos de driver de maio de 2022.

Para obter mais informações, consulte Introdução com UMDF.

Quando as solicitações de E/S de aplicativos chegam, a estrutura coloca cada solicitação na fila de E/S apropriada. Como e quando as solicitações são entregues ao driver dependem de como o driver configura a expedição para a fila de E/S e de como o driver especifica a sincronização de função de retorno de chamada. A fila de E/S também interage com o PnP e o subsistema de gerenciamento de energia da UMDF para manter as solicitações de E/S na fila até que o dispositivo atinja o estado adequado.

Nota O modo de expedição para a fila de E/S não está relacionado ao modo de sincronização. A configuração de expedição da fila de E/S controla o número de solicitações que o driver pode aceitar para processamento a qualquer momento, enquanto a sincronização controla a execução simultânea de funções de retorno de chamada de evento que estão apresentando ou cancelando solicitações. No entanto, vários modos de operação são criados combinando modos de expedição e sincronização.

O driver configura a expedição para uma fila de E/S quando o driver chama o método IWDFDevice::CreateIoQueue para configurar a fila padrão ou criar uma fila secundária. O driver pode especificar um dos valores do tipo de enumeração WDF_IO_QUEUE_DISPATCH_TYPE no parâmetro DispatchType de IWDFDevice::CreateIoQueue para identificar o modo de expedição. Um objeto de fila de E/S pode dar suporte aos seguintes modos de expedição:

  • Sequencial

    O modo de expedição sequencial é especificado usando o valor WdfIoQueueDispatchSequential . Nesse modo de expedição, uma fila no estado de processamento gera eventos para que um driver processe apenas uma solicitação por vez. A fila adia todas as solicitações adicionais até que o driver termine de processar sua solicitação atual ou chame o método IWDFIoRequest::ForwardToIoQueue para solicitar novamente. Quando a solicitação atual é concluída ou encaminhada, a fila gera um evento para fornecer a próxima solicitação.

  • Paralelo

    O modo de expedição paralela é especificado usando o valor WdfIoQueueDispatchParallel . Nesse modo de expedição, uma fila no estado de processamento gera eventos assim que as solicitações de E/S estão prontas para o driver. Quando o driver recebe uma solicitação de E/S, o driver pode processar a solicitação de E/S de uma das seguintes maneiras:

    • O driver chama o método IWDFIoRequest::Complete ou IWDFIoRequest::CompleteWithInformation para concluir a solicitação de E/S imediatamente. Um driver conclui a solicitação de E/S imediatamente se a solicitação de E/S é inválida, não pode ser atendida ou pode ser concluída copiando dados de um buffer ou cache que tem os dados.
    • O driver chama o método IWDFIoRequest::ForwardToIoQueue para enfileirar novamente a solicitação de E/S.
    • O driver chama o método IWDFIoRequest::Send para passar a solicitação de E/S para um driver de nível inferior.
  • Manual

    O modo de expedição manual é especificado usando o valor WdfIoQueueDispatchManual . Nesse modo de expedição, a fila de E/S não notifica automaticamente o driver quando as solicitações chegam à fila. O driver deve chamar o método IWDFIoQueue::RetrieveNextRequest para recuperar solicitações manualmente da fila. Este é um modelo de sondagem.

    Nas versões 1.9 e posteriores do UMDF, se o driver estiver usando o modo de expedição manual, ele poderá chamar IWDFIoRequest2::Requeue para retornar uma solicitação de E/S ao cabeçalho da fila de E/S da qual o driver a obteve. Depois de chamar IWDFIoRequest2::Requeue, a próxima chamada do driver para IWDFIoQueue::RetrieveNextRequest recupera a solicitação requeued.

Para todos os modos de expedição, o objeto de fila de E/S recebe e rastreia a solicitação até que o driver manipule a solicitação ou a solicitação seja cancelada.

Se o driver configurar a fila para expedição serial ou paralela, a estrutura notificará o driver de uma solicitação por meio das funções de retorno de chamada registradas pelo driver quando o driver criar a fila ou configurar a fila padrão. Para obter mais informações, consulte Funções de retorno de chamada de evento de fila de E/S.