Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Qualquer driver de dispositivo de nível inferior que configure seus objetos de dispositivo para E/S direta satisfaz uma solicitação de leitura retornando dados transferidos de seu dispositivo para a memória física do sistema, o que é descrito pelo MDL em Irp-MdlAddress>. Satisfaz uma solicitação de gravação transferindo dados da memória física do sistema para o dispositivo.
Os drivers de nível inferior devem lidar com solicitações de leitura/gravação de forma assíncrona. Portanto, a rotina DispatchReadWrite de cada driver de nível inferior deve passar IRP_MJ_READ e IRP_MJ_WRITE com parâmetros válidos para outras rotinas de driver, conforme descrito em Encaminhando IRPs na Pilha de Drivers.
Para IRPs de leitura/gravação enviados para 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 realizar a transferência solicitada e já foi bloqueada pelo driver de nível mais alto na cadeia hierárquica ou pela gestão 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 driver de dispositivo de nível intermediário ou mais baixo deve validar os parâmetros na posição de pilha de E/S dos IRPs de leitura/escrita se não puder confiar que um driver de nível superior transmita apenas IRPs com parâmetros válidos. Se a rotina DispatchReadWrite encontrar um erro de parâmetro, ela deverá completar o IRP com um valor de erro apropriado STATUS_XXX , conforme descrito em Concluindo IRPs. Se os parâmetros forem válidos, a rotina DispatchReadWrite de um driver intermediário deverá passar a solicitação para processamento posterior, de acordo com as diretrizes em DispatchReadWrite em Higher-Level Drivers.
A rotina DispatchReadWrite de um 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 Passando IRPs para baixo na pilha de drivers.
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 uma taxa de transferência de E/S mais rápida chamando IoStartPacket com um valor de chave determinado pelo driver. Outra rotina no driver desfila o IRP mais tarde, 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 se adequar à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. A rotina DispatchReadWrite deste controlador de dispositivo não deve verificar a posição na pilha de E/S dos IRPs recebidos para quaisquer restrições específicas do dispositivo para transferência, nem tentar calcular intervalos de transferências parciais, caso o driver possa adiar essas verificações até pouco antes de seu StartIo (ou outra rotina de controlador) programar o dispositivo para uma operação de transferência.