Rotinas de expedição e IRQLs
A maioria das rotinas de expedição de drivers é chamada em um contexto de thread arbitrário em IRQL = PASSIVE_LEVEL, com as seguintes exceções:
As rotinas de expedição de driver de nível mais alto são chamadas no contexto do thread que originou a solicitação de E/S, que normalmente é um thread de aplicativo no modo de usuário.
Em outras palavras, as rotinas de expedição de drivers do sistema de arquivos e outros drivers de nível mais alto são chamadas em um contexto de thread nãobitrário em IRQL = PASSIVE_LEVEL.
As rotinas DispatchRead, DispatchWrite e DispatchDeviceControl de drivers de dispositivo de nível mais baixo e de drivers intermediários sobre eles no caminho de paginação do sistema podem ser chamados em IRQL = APC_LEVEL e em um contexto de thread arbitrário.
As rotinas DispatchRead e/ou DispatchWrite e qualquer outra rotina que também processe solicitações de leitura e/ou gravação em um dispositivo de nível mais baixo ou driver intermediário devem ser residentes o tempo todo. Essas rotinas de driver não podem ser pagináveis nem fazer parte da seção pageable-image de um driver; eles não devem acessar nenhuma memória paginável. Além disso, elas não devem depender de chamadas de bloqueio (como KeWaitForSingleObject com um tempo limite diferente de zero).
A rotina DispatchPower de drivers nos caminhos de hibernação e/ou paginação pode ser chamada em IRQL = DISPATCH_LEVEL. As rotinas DispatchPnP desses drivers devem estar preparadas para lidar com solicitações de IRP_MN_DEVICE_USAGE_NOTIFICATION PnP.
A rotina DispatchPower de drivers que exigem energia inrush na inicialização pode ser chamada em IRQL = DISPATCH_LEVEL.
Para obter informações adicionais, consulte Gerenciando prioridades de hardware.