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 atende a uma solicitação de leitura retornando dados transferidos de seu dispositivo para um buffer de espaço do 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 de classe de teclado do sistema processa solicitações de leitura provenientes apenas do thread de entrada do usuário Win32. Esse driver define uma estrutura, KEYBOARD_INPUT_DATA, na qual armazenar pressionamentos de tecla do dispositivo e, a qualquer momento, mantém algumas dessas estruturas em um buffer de anéis 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 o dispositivo aceitar 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 em Concluindo IRPs. Caso contrário, a rotina passa o IRP para processamento adicional por outras rotinas de driver, conforme descrito em Passando IRPs para baixo na Pilha de Driver.

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 faz o driver de classe de teclado do sistema.

Os drivers que armazenam dados em buffer internamente devem dar suporte a solicitações de IRP_MJ_FLUSH_BUFFERS e também podem dar suporte a solicitações de 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 assumir que seus locais de pilha de E/S em um IRP de leitura/gravação têm 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 será necessário para marcar a validade dos parâmetros em seu local de pilha de E/S.