Attese e API

Nota

Il comportamento descritto in questa pagina per un utente APC si applica alle NORMALI API in modalità utente e alle API in modalità utente speciali.

I thread che attendeno un oggetto dispatcher per conto di un chiamante in modalità utente devono essere preparati per l'attesa che 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 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 preparata 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 AlertableTRUE, 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 APC utente. Il sistema operativo interrompe entrambi i tipi di attese per terminare il thread.

Nella tabella seguente viene illustrata la relazione tra diverse impostazioni di parametri, attese e recapito APC utente.

Parametri Attesa interrotta? Utente APC recapitato?
Avvisabile = TRUEWaitMode UserMode =
Avvisabile = TRUEWaitMode KernelMode = No
Avvisabile = FALSEWaitMode UserMode = Sì, per la terminazione del thread. No, per le API utente. No
Avvisabile = FALSEWaitMode KernelMode = No No

È possibile disabilitare le API kernel per un thread. Se si disabilitano le API del kernel per un thread, sia il recapito dell'utente che 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 è interno al sistema operativo, può 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 oKeDelayExecutionThread. Il sistema interrompe e riprende l'attesa internamente. I driver normalmente non sono interessati da questo processo, ma è possibile che il driver non trovi un segnale dell'oggetto dispatcher per una condizione temporanea, ad esempio una chiamata a KePulseEvent.