Rotinas StartIo em drivers de Higher-Level
Qualquer driver de nível superior pode ter uma rotina StartIo . No entanto, é improvável que esse driver seja interoperável com drivers de nível inferior existentes e provavelmente apresentará características de desempenho ruins.
Uma rotina StartIo em um driver de nível superior tem os seguintes efeitos:
Os IRPs de entrada podem ser enfileirados chamando IoStartPacket das rotinas DispatchXxx do driver e IoStartNextPacket de suas rotinas IoCompletion , fazendo com que os IRPs sejam processados um de cada vez por meio da rotina StartIo .
A taxa de transferência de E/S do driver pode se tornar visivelmente mais lenta durante períodos de forte demanda de E/S, porque sua rotina StartIo pode se tornar um gargalo.
A rotina StartIo do driver chama IoCallDriver com cada IRP em IRQL = DISPATCH_LEVEL, fazendo com que todas as rotinas de expedição de drivers de nível inferior também sejam executadas em IRQL = DISPATCH_LEVEL. Isso restringe o conjunto de rotinas de suporte que os drivers inferiores podem chamar em suas rotinas de expedição. Como a maioria dos gravadores de driver pressupõe que as rotinas de expedição de seus drivers sejam executadas no IRQL < DISPATCH_LEVEL, é improvável que o driver de nível superior seja interoperável com muitos drivers de nível inferior existentes.
A rotina StartIo reduz a taxa de transferência geral do sistema porque ela e as rotinas de expedição de todos os drivers de nível inferior em sua cadeia são executadas em IRQL = DISPATCH_LEVEL.
Para obter mais informações sobre as IRQLs nas quais as rotinas de driver padrão são executadas, consulte Gerenciando prioridades de hardware.
Nenhum dos drivers de nível superior fornecidos pelo sistema tem uma rotina StartIo , pois ele pode retardar o processamento irp para o próprio driver, para todos os drivers acima e abaixo dele, e para o sistema em geral.
A maioria dos drivers de nível superior simplesmente envia IRPs para drivers de nível inferior de suas rotinas de expedição e faz qualquer processamento limpo necessário em suas rotinas de IoCompletion.
No entanto, os drivers de nível superior podem configurar filas internas para IRPs que solicitam tipos específicos de operações ou configurar filas internas para manter os IRPs associados a um conjunto de dispositivos subjacentes heterogêneos, como o driver de porta SCSI. Para obter mais informações, consulte Enfileiramento e remoção de IRPs.