Compartilhar via


Esperas e APCs

Observação

O comportamento descrito nesta página para um APC de usuário aplica-se tanto a APCs de modo de usuário regulares quanto a APCs de modo de usuário especiais.

As threads que esperam por um objeto de despacho em nome de um chamador em modo usuário devem estar preparadas para que essa espera seja interrompida, seja por um APC do usuário ou por terminação de threads. 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 Alertável da rotina. Se Alertável = TRUE, a espera é alertável. Caso contrário, a espera será uma espera não alertável. O sistema operacional interrompe esperas alertáveis apenas para fornecer um APC de 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âmetros, tempos de espera e entrega de APC ao usuário.

Parâmetros A espera foi interrompida? O APC do usuário foi entregue?
Alertável = TRUEWaitMode = UserMode Yes Yes
Alertável = TrueWaitMode = KernelMode Yes Não
Alertável = FalseWaitMode = UserMode Sim, para encerramento de thread. Não, para APCs de usuário. Não
Alertável = FalsoWaitMode = KernelMode Não Não

Você pode desabilitar APCs de kernel para um thread. Se você desabilitar APCs de kernel para um thread, a entrega de APCs de usuário e o encerramento de 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 interno ao sistema operacional raramente usado, também podem interromper 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 dispatcher para uma condição transitória, como uma chamada para KePulseEvent.