Compartilhar via


DispatchReadWrite usando E/S em buffer

Qualquer driver de dispositivo de nível mais baixo que configura seus objetos de dispositivo para E/S em buffer satisfaz uma solicitação de leitura retornando dados transferidos de seu dispositivo para um buffer de espaço de sistema bloqueado em Irp-AssociatedIrp.SystemBuffer. Ele atende a uma solicitação de gravação transferindo dados do mesmo buffer para seu dispositivo.

Consequentemente, a rotina DispatchReadWrite desse driver de dispositivo geralmente faz o seguinte ao receber uma solicitação de transferência:

  1. Chama IoGetCurrentIrpStackLocation e determina a direção da solicitação de transferência.

  2. Verifica a validade dos parâmetros para a solicitação.

    • Para uma solicitação de leitura, a rotina geralmente verifica o valor IoStackLocation-Parameters.Read.Length> do driver para determinar se o buffer é grande o suficiente para receber dados transferidos do dispositivo.

      Por exemplo, o driver da classe de teclado do sistema processa solicitações de leitura que vêm apenas do thread de entrada do usuário Win32. Esse driver define uma estrutura, KEYBOARD_INPUT_DATA, na qual armazenar pressionamentos de teclas do dispositivo e, a qualquer momento, mantém algumas dessas estruturas em um buffer de anel interno para atender às solicitações de leitura conforme elas entram.

    • Para uma solicitação de gravação, a rotina geralmente verifica o valor em Parameters.Write.Length e verifica os dados em Irp-AssociatedIrp.SystemBuffer> quanto à validade, se necessário: ou seja, se seu dispositivo aceita apenas pacotes de dados estruturados contendo membros com intervalos de valores definidos.

  3. Se algum parâmetro for inválido, a rotina DispatchReadWrite concluirá o IRP imediatamente, conforme já descrito na conclusão de IRPs. Caso contrário, a rotina passa o IRP para processamento adicional por outras rotinas de driver, conforme descrito em Encaminhamento de IRPs na Pilha de Drivers.

Os drivers de dispositivo de nível mais baixo que usam E/S em buffer geralmente devem atender a uma solicitação de transferência lendo ou gravando dados de um tamanho especificado pelo originador da solicitação. Esse driver provavelmente definirá uma estrutura para dados provenientes ou enviados para seu dispositivo e provavelmente armazenará dados estruturados em buffer internamente, como o driver de classe de teclado do sistema faz.

Os drivers que bufferizam dados internamente devem suportar solicitações IRP_MJ_FLUSH_BUFFERS e também podem suportar solicitações IRP_MJ_SHUTDOWN.

O driver de nível mais alto em uma cadeia geralmente é responsável por verificar os parâmetros do IRP de entrada antes de passar uma solicitação de leitura/gravação para drivers inferiores. Consequentemente, muitos drivers de nível inferior podem presumir que suas localizações na pilha de E/S em um IRP de leitura/gravação possuem parâmetros válidos. Se um driver de nível mais baixo em uma cadeia estiver ciente das restrições específicas do dispositivo em transferências de dados, esse driver deve verificar a validade dos parâmetros na sua localização na pilha de E/S.