Attese e APC
Nota
Il comportamento descritto in questa pagina per un utente APC si applica ai normali APC in modalità utente, nonché alle API speciali in modalità utente.
I thread che attendono un oggetto dispatcher per conto di un chiamante in modalità utente devono essere preparati affinché l'attesa venga interrotta, da un utente APC o dalla terminazione del thread. Quando un thread chiama KeWaitForSingleObject, KeWaitForMultipleObjects, KeWaitForMutexObject o KeDelayExecutionThread, il sistema operativo può posizionare il thread in uno stato di attesa. In genere, il thread rimane nello stato di attesa fino a quando il sistema operativo non può completare l'operazione richiesta dal chiamante. Tuttavia, se il chiamante specifica WaitMode = UserMode , il sistema operativo potrebbe interrompere l'attesa. In tal caso, la routine viene chiusa con un valore NTSTATUS di STATUS_USER_APC.
Qualsiasi driver che chiama una delle quattro routine precedenti con WaitMode = UserMode deve essere preparato per ricevere un valore restituito di STATUS_USER_APC. Il driver deve completare l'operazione corrente con STATUS_USER_APC e restituire il controllo alla modalità utente.
Le situazioni esatte in cui il sistema operativo interrompe l'attesa dipende dal valore del parametro Alertable della routine. Se Alertable = TRUE, l'attesa è un'attesa avvisabile. In caso contrario, l'attesa è un'attesa non avvisabile. Il sistema operativo interrompe le attese avvisabili solo per recapitare un utente APC. Il sistema operativo interrompe entrambi i tipi di attesa per terminare il thread.
Nella tabella seguente viene illustrata la relazione tra impostazioni di parametri diverse, attese e recapito APC dell'utente.
Parametri | Aspetta interrotta? | Utente APC recapitato? |
---|---|---|
Alertable = TRUE WaitMode UserMode = | Sì | Sì |
Alertable = TRUE WaitMode KernelMode = | Sì | No |
Alertable = FALSE WaitMode UserMode = | Sì, per la terminazione del thread. No, per le API utente. | No |
Alertable = FALSE WaitMode KernelMode = | No | No |
È possibile disabilitare le API del kernel per un thread. Se si disabilitano le API del kernel per un thread, anche il recapito APC dell'utente e la terminazione del thread per tale thread sono disabilitati. Per altre informazioni su come disabilitare le API, vedere Disabilitazione delle API.
Gli avvisi, un meccanismo usato raramente che sono interni al sistema operativo, possono anche interrompere gli stati di attesa avvisabili. Un avviso può interrompere un'attesa quando Alertable = TRUE, indipendentemente dal valore del parametro WaitMode. La routine in attesa restituisce un valore di STATUS_ALERTED.
Si noti che le API del kernel vengono eseguite in modo preemptive e non causano la restituzione di KeWaitForXxx o KeDelayExecutionThread . Il sistema interrompe e riprende l'attesa internamente. I driver normalmente non sono interessati da questo processo, ma è possibile che il driver non segnali un oggetto dispatcher per una condizione temporanea, ad esempio una chiamata a KePulseEvent.