Attentes et APC

Remarque

Le comportement décrit sur cette page pour un UTILISATEUR APC 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 l’arrêt du 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 dans 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 par 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 effectuer 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 l’option TRUE peut être alertable = , l’attente est une attente pouvant être alertable. Sinon, l’attente est une attente non alertable. Le système d’exploitation interrompt les attentes alertables uniquement pour fournir 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 différents paramètres, attentes et remise d’APC utilisateur.

Paramètres Attendez l’interruption ? L’UTILISATEUR APC a livré ?
True WaitMode UserMode = alertable = Oui Oui
True WaitMode KernelMode = alertable = Oui Non
False WaitMode UserMode = alertable = Oui, pour l’arrêt du thread. Non, pour les API utilisateur. Non
False WaitMode KernelMode = alertable = Non Non

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

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

Notez que les API du noyau s’exécutent préemptivement et n’entraînent 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 que le pilote manque un signal d’objet de répartiteur pour une condition temporaire, tel qu’un appel à KePulseEvent.