Partilhar via


Resumo das rotinas de despacho de leitura/gravação

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

  • É responsabilidade do driver do nível mais alto numa cadeia de drivers em camadas verificar a validade dos parâmetros dos IRPs de leitura/escrita recebidos antes de configurar a localização da pilha de I/O do próximo driver de nível inferior no IRP.

  • Os controladores de nível intermédio e mais baixo geralmente podem confiar no controlador de nível mais alto na sua cadeia para transmitir solicitações de transferência com parâmetros válidos. No entanto, qualquer driver pode executar verificações de consistência nos parâmetros na posição de pilha de E/S de um IRP, e cada driver de dispositivo deve verificar os parâmetros para condições que possam violar quaisquer restrições impostas pelo dispositivo.

  • Se uma rotina DispatchReadWrite concluir um IRP com um erro, ela deverá definir o membro Status da localização da pilha de E/S com um valor apropriado do tipo NTSTATUS, definir o membro Information para 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 algum número dessas estruturas internamente.

  • Se um driver utilizar E/S direta (Input/Output), poderá ter de verificar se o MDL em Irp-MdlAddress> descreve um buffer que contém dados em excesso (ou muitas quebras de página) para que o dispositivo subjacente consiga gerir numa única operação de transferência. Em caso afirmativo, o condutor deve dividir o pedido de transferência original numa sequência de operações de transferência mais pequenas.

    Um driver de classe estreitamente acoplado pode repartir essa solicitação na sua rotina DispatchReadWrite para o seu driver de porta subjacente. Drivers de classe SCSI, particularmente 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 solicitação de transferência grande em transferências parciais até que outra rotina de driver desenfileire o IRP para configurar o dispositivo para a transferência.

  • Se um driver de dispositivo de nível inferior enfileirar um IRP de leitura/gravação para processamento adicional por suas próprias rotinas, ele deverá 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 de nível inferior, deverá configurar, no IRP, o local da pilha de E/S para o próximo driver inferior. Se o driver de nível superior também define uma rotina IoCompletion no IRP antes de passá-la para frente com IoCallDriver depende do design do driver e das camadas sob ele.

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

  • Se um controlador de nível superior alocar IRPs para controladores mais baixos que possam incluir um controlador de dispositivo de mídia removível subjacente, o controlador alocador deve estabelecer o contexto de execução (thread) em cada IRP que ele atribui.