Compartilhar via


DispatchReadWrite em Higher-Level Drivers

Com exceção dos drivers do sistema de arquivos, um driver de nível superior geralmente não tem filas de driver internas 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 na Pilha de Drivers.

No entanto, a rotina DispatchReadWrite de um driver de classe SCSI é responsável por dividir grandes solicitações de transferência, 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 driver de porta/miniporto SCSI. Para obter mais informações, consulte a 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 algum número de transferências parciais, a rotina DispatchReadWrite deve chamar IoSetCompletionRoutine com cada IRP alocado pelo driver. O driver deve registrar sua rotina de IoCompletion para acompanhar a quantidade de dados 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 devem possuir um contexto de thread. Para configurar um contexto de thread, o driver de alocação deve definir Irp-Tail.Overlay>.Thread em cada novo IRP alocado com o mesmo valor do IRP de transferência de entrada. Para obter mais informações, consulte suporte aode 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 todos os IRPs e memória que o driver de nível superior alocou.

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 do dispositivo subjacente), a rotina DispatchReadWrite deverá alocar essa memória do pool de memória não paginada.