Partilhar via


DispatchReadWrite usando E/S em buffer

Qualquer driver de dispositivo de nível mais baixo que configure os seus objetos de dispositivo para E/S em buffer satisfaz uma solicitação de leitura retornando dados transferidos do seu dispositivo para um buffer na memória de sistema bloqueada em Irp-AssociatedIrp.SystemBuffer>. Ele satisfaz uma solicitação de gravação transferindo dados do mesmo buffer para o seu dispositivo.

Consequentemente, a rotina DispatchReadWrite de tal 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 que vêm somente do thread de entrada do usuário Win32. Este driver define uma estrutura, KEYBOARD_INPUT_DATA, na qual armazenar pressionamentos de teclas do dispositivo e, a qualquer momento, mantém um número dessas estruturas num buffer circular interno, a fim de satisfazer as solicitações de leitura à medida que chegam.

    • 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 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 pela pilha de drivers.

Os drivers de dispositivo de nível mais baixo que usam E/S em buffer geralmente devem satisfazer uma solicitação de transferência lendo ou gravando dados de um tamanho especificado pelo originador da solicitação. É provável que esse driver defina uma estrutura para os dados que entram ou são enviados para seu dispositivo e é provável que armazene dados estruturados internamente, como faz o driver de classe de teclado do sistema.

Os drivers que armazenam dados em buffer internamente devem oferecer suporte a solicitações de IRP_MJ_FLUSH_BUFFERS e também podem dar suporte a 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 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 numa cadeia estiver ciente de restrições específicas do dispositivo em transferências de dados, esse driver deve verificar a validade dos parâmetros na sua localização da pilha de E/S.