Desabilitando APCs

O sistema fornece três mecanismos para desabilitar APCs para o thread atual:

  • Regiões críticas. Quando um thread está dentro de uma região crítica, suas APCs de usuário e APCs de kernel normais não são executadas. ApCs de kernel especiais ainda são executadas. Para obter mais informações sobre esses tipos de APC, consulte Tipos de APCs.

  • Regiões protegidas. Quando um thread está dentro de uma região protegida, nenhuma de suas APCs é executada.

  • Elevando o IRQL atual para APC_LEVEL ou superior. Um thread que está sendo executado em IRQL >= APC_LEVEL é executado com todas as APCs desabilitadas.

Observe que essas configurações se aplicam ao thread atual e não afetam o comportamento de nenhum outro thread.

Algumas rotinas de suporte ao driver devem ser chamadas com tipos específicos de APCs desabilitados. Por exemplo, rotinas que adquirem um recurso executivo (como ExAcquireResourceSharedLite) devem ser chamadas com APCs de kernel normais desabilitadas. Outras rotinas devem ser chamadas com tipos específicos de APCs habilitadas. Por exemplo, qualquer rotina que dependa de uma rotina de conclusão de E/S (como IoVolumeDeviceToDosName) deve ser chamada com APCs de kernel especiais habilitadas. A documentação de cada rotina especifica se a rotina tem restrições específicas sobre o estado da execução do APC.

Um driver pode inserir explicitamente uma região crítica ou protegida chamando a rotina apropriada. Para obter mais informações, consulte Regiões críticas e regiões protegidas. Um driver também pode aumentar explicitamente o IRQL atual para APC_LEVEL chamando KeRaiseIrql. O driver deve, posteriormente, reduzir o IRQL para seu valor original chamando KeLowerIrql. Usar uma região protegida é mais rápido do que aumentar e reduzir o IRQL atual, mas as regiões protegidas só estão disponíveis no Windows Server 2003 e em versões posteriores do Windows.

As seguintes operações de mutex têm o mesmo efeito que entrar ou deixar uma região crítica ou protegida ou aumentar ou reduzir o IRQL atual:

  • Manter um objeto mutex coloca implicitamente o suporte dentro de uma região crítica.

  • Manter um mutex protegido coloca implicitamente o suporte dentro de uma região protegida.

  • Manter um mutex rápido aumenta implicitamente o IRQL atual para APC_LEVEL.

Para obter mais informações sobre objetos mutex, consulte Objetos Mutex. Para obter mais informações sobre mutexes rápidos e protegidos, consulte Mutexes rápidos e mutexes protegidos.