Gerenciando métodos de acesso de buffer em drivers UMDF

Se você estiver escrevendo um driver UMDF, poderá especificar preferências para o método de acesso de buffer que a estrutura usa para solicitações de leitura e gravação, bem como solicitações de controle de E/S do dispositivo. Os valores que um driver UMDF fornece são apenas preferências e não têm garantia de serem usados pela estrutura.

Especificando um método de acesso de buffer preferencial

A partir do UMDF versão 2.0, um driver UMDF chama WdfDeviceInitSetIoTypeEx para registrar métodos de acesso preferenciais para solicitações de leitura/gravação e para solicitações de controle de E/S do dispositivo.

Se o driver não chamar WdfDeviceInitSetIoTypeEx, o UMDF usará o método armazenado em buffer para solicitações de E/S para este dispositivo.

A estrutura usa as seguintes regras para determinar qual método de acesso usar:

  • Todos os drivers UMDF em uma pilha de driver devem usar o mesmo método para acessar os buffers de um dispositivo e a estrutura dá preferência a E/S em buffer.

    Se o UMDF determinar que alguns drivers preferem E/S em buffer ou E/S direta para um dispositivo, enquanto outros drivers preferem apenas E/S em buffer para o dispositivo, o UMDF usa E/S em buffer para todos os drivers. Se um ou mais drivers de uma pilha preferirem apenas E/S em buffer, enquanto outros preferirem apenas E/S direta, o UMDF registrará um evento no log de eventos do sistema e não iniciará a pilha de driver.

    Seu driver pode chamar WdfDeviceGetDeviceStackIoType para determinar os métodos de acesso ao buffer atribuídos pelo UMDF às solicitações de leitura/gravação de um dispositivo e solicitações de controle de E/S.

  • Em alguns casos, o UMDF atribui E/S direta a um dispositivo, mas, para melhor desempenho, usa E/S em buffer para uma ou mais solicitações do dispositivo. Por exemplo, o UMDF usa E/S em buffer para buffers pequenos se puder copiar os dados para o buffer do driver mais rapidamente do que pode mapear os buffers para acesso direto.

    Opcionalmente, o driver pode fornecer um valor DirectTransferThreshold quando chama WdfDeviceInitSetIoTypeEx. A estrutura usa esse valor para determinar o menor tamanho de buffer para o qual a estrutura usará E/S direta. Normalmente, você não precisa fornecer esse valor porque a estrutura usa configurações que fornecem o melhor desempenho.

  • O UMDF usa E/S direta somente para o espaço de buffer que começa e termina em um limite de página de memória. Se o início ou o final de um buffer não estiver em um limite de página, o UMDF usará E/S em buffer para essa parte do buffer. Em outras palavras, o UMDF pode usar E/S em buffer e E/S direta para uma transferência de dados grande que consiste em várias solicitações de E/S.

  • Para solicitações de controle de E/S do dispositivo, o UMDF usará E/S direta somente se o IOCTL (código de controle de E/S) especificar E/S direta e somente se todos os drivers UMDF para esse dispositivo tiverem chamado WdfDeviceInitSetIoTypeEx para especificar o método de acesso direto.

Recuperando o método access para uma solicitação de E/S

Os drivers usam o mesmo conjunto de métodos de objeto de solicitação para acessar buffers de dados, independentemente do método de acesso ao buffer. Portanto, a maioria dos drivers normalmente não precisa saber se o UMDF está usando E/S em buffer ou E/S direta para uma solicitação de E/S.

Em alguns casos, você pode melhorar o desempenho de um driver se souber o método de acesso para uma solicitação de E/S. Por exemplo, considere um dispositivo de alta taxa de transferência que normalmente usa E/S direta. Quando o driver recebe uma solicitação de E/S, ele copia dados do espaço de buffer compartilhado na memória do driver local para validação.

No entanto, o driver pode receber ocasionalmente um buffer que usa E/S em buffer. Como o gerenciador de E/S já copiou esses dados em um buffer intermediário, o driver não precisa copiar os parâmetros localmente. Ao evitar a operação de cópia, o driver melhora o desempenho.

Um driver UMDF chama WdfRequestGetEffectiveIoType para obter o método de acesso ao buffer de uma solicitação de E/S. Conforme descrito acima, o tipo de E/S de uma solicitação específica pode ser diferente das configurações de tipo de E/S atribuídas pela estrutura para um dispositivo.

Convertendo de E/S em buffer nem E/S Direta

Um driver UMDF não pode usar o método "nem".

No entanto, as definições de alguns IOCTLs (códigos de controle de E/S do dispositivo) especificam que as solicitações usam o método "nenhum dos dois". Opcionalmente, um driver UMDF pode converter o método de acesso de buffer dessas solicitações de controle de E/S do dispositivo para E/S em buffer ou E/S direta. Use as seguintes etapas:

  1. Inclua a diretiva UmdfMethodNeitherAction em uma seção INF DDInstall do arquivo INF do driver. Você pode definir o valor da diretiva para indicar que o UMDF deve passar solicitações de controle de E/S do dispositivo que usam o método de acesso "nenhum" para o driver. (Caso contrário, o UMDF concluirá essas solicitações de E/S com um erro status valor.)

  2. Acesse os buffers da solicitação de E/S usando os métodos de objeto que o UMDF fornece para E/S em buffer ou E/S direta.

Você deverá habilitar o suporte de solicitações IOCTL que usam o método "nenhum" somente se tiver certeza de que o UMDF pode converter o método de acesso em E/S em buffer ou E/S direta. Por exemplo, se o IOCTL especificar uma solicitação personalizada que não segue as regras de especificação de buffer descritas em Descrições de Buffer para códigos de controle de E/S, o UMDF não poderá converter os buffers.