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 inferior que configura seus objetos de dispositivo para E/S direta atende a uma solicitação de leitura retornando dados transferidos de seu dispositivo para memória física do sistema, que é descrito pelo MDL em Irp-MdlAddress>. Ele atende a uma solicitação de gravação transferindo dados da memória física do sistema para seu dispositivo.
Os drivers de nível inferior devem lidar com solicitações de leitura/gravação de forma assíncrona. Portanto, cada rotina DispatchReadWrite de driver de nível inferior deve passar IRP_MJ_READ e IRP_MJ_WRITE IRPs com parâmetros válidos para outras rotinas de driver, conforme descrito em Passar IRPs para baixo na Pilha de Driver.
Para IRPs de leitura/gravação enviados a drivers de nível inferior, a memória física paginada descrita pelo MDL em Irp-MdlAddress> já foi verificada quanto aos direitos de acesso corretos para assegurar a realização da transferência solicitada e já foi travada pelo driver de nível mais alto da cadeia ou pelo gerenciador de E/S. Qualquer driver intermediário ou de nível mais baixo que configure seus objetos de dispositivo para E/S direta não deve chamar MmProbeAndLockPages porque isso já foi feito. Um driver de nível mais baixo chama MmGetSystemAddressForMdlSafe. (Drivers para Windows 98 chamam MmGetSystemAddressForMdl em vez disso. Drivers para Windows Me, Windows 2000 e versões posteriores do Windows devem usar MmGetSystemAddressForMdlSafe.)
Qualquer rotina DispatchReadWrite de um driver de dispositivo intermediário ou de nível mais baixo deve validar os parâmetros na sua localização de pilha de E/S de IRPs de leitura/escrita, caso ele não possa confiar que um driver de nível superior irá passar adiante apenas IRPs com parâmetros válidos. Se a rotina DispatchReadWrite encontrar um erro de parâmetro, ela deverá concluir o IRP com um erro apropriado STATUS_valorXXX, conforme já descrito em Completing IRPs. Se os parâmetros forem válidos, a rotina DispatchReadWrite de um driver intermediário deverá passar a solicitação para processamento adicional, de acordo com as diretrizes em DispatchReadWrite no Higher-Level Drivers.
Uma rotina DispatchReadWrite do driver de dispositivo de nível mais baixo deve chamar IoMarkIrpPending com a solicitação de transferência, passar o IRP para processamento adicional por outras rotinas de driver e retornar STATUS_PENDING, conforme descrito em Passar IRPs para baixo na Pilha de Driver.
Observe que a rotina DispatchReadWrite de um driver de dispositivo pode controlar a ordem na qual os IRPs são enfileirados em seu dispositivo para obter uma taxa de transferência de E/S mais rápida chamando IoStartPacket com um valor chave determinado pelo driver. Outra rotina no driver desativa o IRP posteriormente, determina se o comprimento solicitado deve ser dividido em operações de transferência parcial e programa o dispositivo para transferir dados.
Em geral, um driver de dispositivo que deve dividir grandes solicitações de transferência para atender às limitações de seu dispositivo deve adiar essas operações até pouco antes de configurar o dispositivo para uma determinada solicitação de transferência. Essa rotina DispatchReadWrite de um driver de dispositivo não deve verificar o local da pilha de E/S de IRPs de entrada para quaisquer restrições de transferência específicas do dispositivo ou tentar calcular intervalos de transferência parcial, quando o driver pode adiar essas verificações até pouco antes de seu StartIo (ou outra rotina de driver) configurar o dispositivo para uma operação de transferência.