Esperas e APCs
Observação
O comportamento descrito nesta página para uma APC de usuário se aplica a APCs regulares no modo de usuário, bem como a APCs especiais no modo de usuário.
Os threads que aguardam um objeto dispatcher em nome de um chamador do modo de usuário devem estar preparados para que essa espera seja interrompida, seja por um APC de usuário ou pelo encerramento do thread. Quando um thread chama KeWaitForSingleObject, KeWaitForMultipleObjects, KeWaitForMutexObject ou KeDelayExecutionThread, o sistema operacional pode colocar o thread em um estado de espera. Normalmente, o thread permanece no estado de espera até que o sistema operacional possa concluir a operação solicitada pelo chamador. No entanto, se o chamador especificar WaitMode = UserMode, o sistema operacional poderá interromper a espera. Nesse caso, a rotina é encerrada com um valor NTSTATUS de STATUS_USER_APC.
Qualquer driver que chame uma das quatro rotinas anteriores com WaitMode = UserMode deve estar preparado para receber um valor retornado de STATUS_USER_APC. O driver deve concluir sua operação atual com STATUS_USER_APC e retornar o controle ao modo de usuário.
As situações exatas em que o sistema operacional interrompe a espera dependem do valor do parâmetro Alertable da rotina. Se for Alertable = TRUE, a espera será uma espera alertável. Caso contrário, a espera será uma espera não alertável. O sistema operacional interrompe esperas alertáveis apenas para entregar um APC do usuário. O sistema operacional interrompe os dois tipos de espera para encerrar o thread.
A tabela a seguir explica a relação entre diferentes configurações de parâmetro, esperas e entrega de APC do usuário.
Parâmetros | Espera interrompida? | Usuário APC entregue? |
---|---|---|
UserMode = TRUE alertável = | Sim | Sim |
Alertável = TRUE WaitMode = KernelMode | Sim | No |
Alertable = FALSE WaitMode = UserMode | Sim, para terminação de thread. Não, para APCs de usuário. | Não |
Alertable = FALSE WaitMode = KernelMode | Não | No |
Você pode desabilitar APCs de kernel para um thread. Se você desabilitar as APCs do kernel para um thread, a entrega da APC do usuário e o encerramento do thread para esse thread também serão desabilitados. Para obter mais informações sobre como desabilitar APCs, consulte Desabilitando APCs.
Os alertas, um mecanismo raramente usado que é interno ao sistema operacional, também podem interromper os estados de espera alertáveis. Um alerta pode interromper uma espera quando Alertable = TRUE, independentemente do valor do parâmetro WaitMode. A rotina de espera retorna um valor de STATUS_ALERTED.
Observe que as APCs do kernel são executadas preventivamente e não fazem com que KeWaitForXxx ou KeDelayExecutionThread retornem. O sistema interrompe e retoma a espera internamente. Normalmente, os drivers não são afetados por esse processo, mas é possível que o driver perca um sinal de objeto do dispatcher para uma condição transitória, como uma chamada para KePulseEvent.