Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Se estiveres a escrever um driver UMDF, podes especificar preferências para o método de acesso ao buffer que o framework utiliza para pedidos de leitura e escrita, bem como para pedidos de controlo de E/S do dispositivo. Os valores que um driver UMDF fornece são apenas preferências e não é garantido que sejam usados pela estrutura.
- Especificando um método de acesso de buffer preferencial
- Recuperando o método de acesso para uma solicitação de E/S
- Conversão de E/S sem buffer nem E/S direta
Especificando um método de acesso de buffer preferencial
A partir da versão 2.0 do UMDF, 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 usa o método em buffer para pedidos de I/O destinados a este dispositivo.
A estrutura usa as seguintes regras para determinar qual método de acesso usar:
Todos os drivers UMDF em uma pilha de drivers devem usar o mesmo método para acessar os buffers de um dispositivo, e a estrutura dá preferência à 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 usará 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 drivers.
Seu driver pode chamar WdfDeviceGetDeviceStackIoType para determinar os métodos de acesso de buffer que UMDF atribuiu às solicitações de leitura/gravação e solicitações de controle de E/S de um dispositivo.
Em alguns casos, o UMDF atribui E/S direta a um dispositivo, mas, para obter o melhor desempenho, usa E/S em buffer para uma ou mais solicitações do dispositivo. Por exemplo, o UMDF utiliza E/S em buffer para pequenos buffers se puder copiar mais rapidamente os dados para o buffer do driver do que mapear os buffers para acesso direto.
Opcionalmente, seu driver pode fornecer um valor DirectTransferThreshold quando ele 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 utiliza entrada/saída direta apenas para espaço de buffer que começa e termina num limite de página de memória física. Se o início ou o fim 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 grande transferência de dados que consiste em várias solicitações de E/S.
Para solicitações de controle de E/S de dispositivo, o UMDF usa E/S direta somente se o código de controle de E/S (IOCTL) especificar E/S direta e somente se todos os drivers UMDF para esse dispositivo tiverem chamado WdfDeviceInitSetIoTypeEx especificar o método de acesso direto.
Recuperando o método de acesso 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 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 para a memória do driver local para validação.
No entanto, o driver pode ocasionalmente receber um buffer que usa E/S bufferizada. 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 de software 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 para uma solicitação específica pode diferir das configurações de tipo de E/S atribuídas pela estrutura para um dispositivo.
Conversão de E/S sem buffer nem E/S direta
Um driver UMDF não pode usar o método "neither".
No entanto, as definições de de alguns códigos de controlo de E/S de dispositivo (IOCTLs) especificam que as solicitações utilizam o método "nenhuma". Opcionalmente, um driver UMDF pode converter o método de acesso ao buffer de tais solicitações de controle de E/S do dispositivo em E/S em buffer ou E/S direta. Utilize os passos seguintes:
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 encaminhar ao driver as solicitações de controlo de E/S do dispositivo que utilizam o método de acesso "neither". (Caso contrário, o UMDF conclui essas solicitações de E/S com um valor de status de erro.)
Acesse os buffers da solicitação de E/S usando os métodos de objeto que o UMDF fornece para de E/S em buffer ou de E/S direta.
Você deve habilitar o suporte a pedidos IOCTL que utilizam o método "neither" somente se tiver certeza de que o UMDF pode converter o método de acesso para E/S em buffer ou E/S direta. Por exemplo, se o IOCTL especificar uma solicitação personalizada que não siga 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.