Compartilhar via


DispatchReadWrite em drivers de Higher-Level

Exceto para drivers do sistema de arquivos, um driver de nível superior geralmente não tem nenhuma fila de driver interno para IRPs. Essa rotina DispatchReadWrite de um driver pode passar IRPs com parâmetros válidos para drivers inferiores, possivelmente depois de configurar sua rotina IoCompletion , conforme descrito em Passando IRPs para baixo na Pilha de Driver.

No entanto, a rotina DispatchReadWrite de um driver de classe SCSI é responsável por dividir solicitações de transferência grandes, se necessário, antes de enviar um IRP com o código de função principal IRP_MJ_READ ou IRP_MJ_WRITE para o par de drivers de porta/miniport scsi. Para obter mais informações, consulte Rotina SplitTransferRequest do Driver de Classe de Armazenamento.

Se um driver de nível superior alocar um ou mais IRPs, que ele configura para o driver mais baixo em sua rotina DispatchReadWrite , para solicitar algumas transferências parciais, a rotina DispatchReadWrite deve chamar IoSetCompletionRoutine com cada IRP alocado por driver. O driver deve registrar sua rotina IoCompletion para acompanhar quantos dados são transferidos em cada operação de transferência parcial para que a rotina IoCompletion possa liberar todos os IRPs alocados pelo driver e, eventualmente, concluir a solicitação original.

Se o driver subjacente controlar um dispositivo de mídia removível, todos os IRPs alocados pelo driver de nível superior deverão ter um contexto de thread. Para configurar um contexto de thread, o driver de alocação deve definir Irp-Tail.Overlay>. Thread em cada IRP recém-alocado do mesmo valor no IRP de transferência de entrada. Para obter mais informações, consulte Suporte a mídia removível.

Se o driver de dispositivo subjacente retornar um IRP para uma transferência parcial com um erro, a rotina IoCompletion poderá repetir a solicitação de transferência parcial ou concluir o IRP original com seu bloco de status de E/S definido com o erro retornado, depois de liberar qualquer IRPs e memória que o driver de nível superior tenha alocado.

Se a rotina DispatchReadWrite de um driver de nível superior alocar memória para operações de transferência parcial e sua alocação será acessada pela rotina IoCompletion do driver (ou pelo driver de dispositivo subjacente), a rotina DispatchReadWrite deverá alocar essa memória do pool nãopagado.