Compartilhar via


Resumo das Rotinas de Despacho de Leitura/Gravação

Tenha os seguintes pontos em mente ao implementar uma rotina DispatchRead, DispatchWrite ou DispatchReadWrite :

  • É responsabilidade do driver de nível mais alto em uma cadeia de drivers em camadas de verificar os parâmetros dos IRPs de leitura/gravação recebidos quanto à validade antes de configurar o local da pilha de E/S do driver de nível inferior em um IRP.

  • Os drivers intermediários e de nível mais baixo geralmente podem contar com o driver de nível mais alto em sua cadeia para passar solicitações de transferência com parâmetros válidos. No entanto, qualquer driver pode realizar verificações de consistência nos parâmetros no local de pilha de E/S correspondente a um IRP, e cada driver de dispositivo deve verificar os parâmetros em busca de condições que possam violar quaisquer restrições impostas por seu dispositivo.

  • Se uma rotina DispatchReadWrite concluir um IRP com um erro, ela deverá definir o membro Status na localização de pilha de E/S com um valor de tipo NTSTATUS apropriado, definir o membro Informações como zero e chamar IoCompleteRequest com o IRP e um PriorityBoost de IO_NO_INCREMENT.

  • Se um driver usa E/S em buffer, talvez seja necessário definir uma estrutura para conter dados a serem transferidos e talvez seja necessário armazenar em buffer algumas dessas estruturas internamente.

  • Se um driver usa E/S direta, pode ser necessário verificar se o MDL no Irp-MdlAddress> descreve um buffer que contém excesso de dados (ou muitas quebras de página) para que o dispositivo subjacente consiga manipular em uma única operação de transferência. Nesse caso, o driver deve dividir a solicitação de transferência original em uma sequência de operações de transferência menores.

    Um driver de classe estreitamente acoplado pode dividir essa solicitação em sua rotina DispatchReadWrite para seu driver de porta subjacente. Drivers de classe SCSI, especialmente para dispositivos de armazenamento em massa, são necessários para fazer isso. Para obter mais informações sobre os requisitos para drivers SCSI, consulte Drivers de Armazenamento.

  • A rotina DispatchReadWrite de um driver de dispositivo de nível inferior deve adiar a divisão de uma grande solicitação de transferência em transferências parciais até que outra rotina de driver desqueque o IRP para configurar o dispositivo para a transferência.

  • Se um driver de dispositivo de nível inferior enfileira um IRP de leitura/gravação para processamento adicional por suas próprias rotinas, ele deve chamar IoMarkIrpPending antes de enfileirar o IRP. A rotina DispatchReadWrite também deve retornar o controle com STATUS_PENDING nessas circunstâncias.

  • Se a rotina DispatchReadWrite passar um IRP para drivers mais baixos, ela deverá configurar o local da pilha de E/S para o próximo driver inferior no IRP. Se o driver de nível superior também define uma rotina IoCompletion no IRP antes de passá-lo com IoCallDriver, isso depende do design do próprio driver e dos que estão em camadas abaixo dele.

    No entanto, um driver de nível superior deve chamar IoSetCompletionRoutine antes de chamar IoCallDriver caso aloque recursos, como IRPs ou memória. Sua rotina IoCompletion deve liberar todos os recursos alocados pelo driver quando drivers inferiores tiverem concluído a solicitação, mas antes da rotina IoCompletion chamar IoCompleteRequest com o IRP original.

  • Se um driver de nível superior alocar IRPs para drivers inferiores que possam incluir um driver de dispositivo de mídia removível subjacente, o driver de alocação deverá estabelecer o contexto de thread em cada IRP alocado.