Compartilhar via


DispatchReadWrite usando E/S Direta

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 Passando 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 investigada 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 ou pelo gerente 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.)

A rotina DispatchReadWrite de qualquer driver de dispositivo intermediário ou de nível mais baixo deve validar os parâmetros em seu local de pilha de E/S de IRPs de leitura/gravação se não puder confiar em um driver de nível superior para passar 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 Concluindo 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 Passando 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 key 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 marcar o local da pilha de E/S de IRPs de entrada para quaisquer restrições de transferência específicas do dispositivo, nem 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) programar o dispositivo para uma operação de transferência.