Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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:
Chama IoGetCurrentIrpStackLocation e determina a direção da solicitação de transferência.
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.
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.