Partilhar via


Rotinas de Despacho e IRQLs

A maioria das rotinas de despacho dos motoristas são chamadas em um contexto de thread arbitrário em IRQL = PASSIVE_LEVEL, com as seguintes exceções:

  • As rotinas de despacho de qualquer driver de nível mais alto são chamadas no contexto do encadeamento que originou a solicitação de E/S, que geralmente é um encadeamento de um aplicativo de modo utilizador.

    Em outras palavras, as rotinas de despacho de drivers de sistema de arquivos e outros drivers de nível mais alto são chamadas em um contexto de thread não arbitrá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 em camadas acima deles no caminho de paginação do sistema podem ser chamadas 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 em todos os momentos. Essas rotinas de driver não podem ser pagináveis nem fazer parte da seção de imagem paginável de um driver; elas não devem acessar nenhuma memória paginável. Além disso, eles não devem depender de nenhuma chamada de bloqueio (como KeWaitForSingleObject com um tempo limite diferente de zero).

  • A rotina DispatchPower dos 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 PnP IRP_MN_DEVICE_USAGE_NOTIFICATION.

  • A rotina DispatchPower dos controladores que necessitam de corrente de irrupção no arranque pode ser invocada com IRQL = DISPATCH_LEVEL.

Para obter informações adicionais, consulte Gerenciando prioridades de hardware.