Attentes et API

Notes

Le comportement décrit sur cette page pour un APC utilisateur s’applique aux API en mode utilisateur standard ainsi qu’aux API en mode utilisateur spéciales.

Les threads qui attendent un objet de répartiteur pour le compte d’un appelant en mode utilisateur doivent être préparés pour que cette attente soit interrompue, soit par un utilisateur APC, soit par arrêt de thread. Lorsqu’un thread appelle KeWaitForSingleObject, KeWaitForMultipleObjects, KeWaitForMutexObject ou KeDelayExecutionThread, le système d’exploitation peut placer le thread dans un état d’attente. En règle générale, le thread reste à l’état d’attente jusqu’à ce que le système d’exploitation puisse terminer l’opération que l’appelant demande. Toutefois, si l’appelant spécifie WaitMode = UserMode, le système d’exploitation peut interrompre l’attente. Dans ce cas, la routine se termine avec une valeur NTSTATUS de STATUS_USER_APC.

Tout pilote qui appelle l’une des quatre routines précédentes avec WaitMode = UserMode doit être prêt à recevoir une valeur de retour de STATUS_USER_APC. Le pilote doit terminer son opération actuelle avec STATUS_USER_APC et retourner le contrôle en mode utilisateur.

Les situations exactes dans lesquelles le système d’exploitation interrompt l’attente dépendent de la valeur du paramètre Alertable de la routine. Si alertable = TRUE, l’attente est une attente pouvant être alerté. Sinon, l’attente est une attente non alertable. Le système d’exploitation interrompt les attentes alertables uniquement pour remettre un APC utilisateur. Le système d’exploitation interrompt les deux types d’attente pour arrêter le thread.

Le tableau suivant explique la relation entre les différents paramètres, les attentes et la remise d’APC par l’utilisateur.

Paramètres Attendre interrompu ? APC de l’utilisateur livré ?
Alertable = TRUEWaitMode = UserMode Oui Oui
Alertable = TRUEWaitMode = KernelMode Oui Non
Alertable = FALSEWaitMode = UserMode Oui, pour l’arrêt du thread. Non, pour les API utilisateur. Non
Alertable = FALSEWaitMode = KernelMode Non Non

Vous pouvez désactiver les API de noyau pour un thread. Si vous désactivez les API de noyau pour un thread, la remise d’APC utilisateur et l’arrêt du thread pour ce thread sont également désactivées. Pour plus d’informations sur la désactivation des API, consultez Désactivation des API.

Les alertes, mécanisme rarement utilisé interne au système d’exploitation, peuvent également interrompre les états d’attente pouvant être alertables. Une alerte peut interrompre une attente lorsque l’option Alertable = TRUE, quelle que soit la valeur du paramètre WaitMode . La routine d’attente retourne une valeur de STATUS_ALERTED.

Notez que les API de noyau s’exécutent de manière préventive et ne provoquent pas le retour de KeWaitForXxx ou KeDelayExecutionThread . Le système interrompt et reprend l’attente en interne. Les pilotes ne sont normalement pas affectés par ce processus, mais il est possible pour le pilote de manquer un signal d’objet de répartiteur pour une condition temporaire, comme un appel à KePulseEvent.