Suppression d’un objet minuteur System-Allocated

À compter de Windows 8.1, la routine ExDeleteTimer supprime un objet de minuteur créé par la routine ExAllocateTimer. Cet objet minuteur est une structure de EX_TIMER allouée par le système dont les membres sont opaques aux pilotes. Avant la suppression d’un objet minuteur, ExDeleteTimer désactive d’autres opérations du minuteur sur l’objet et annule ou termine toute opération en attente sur l’objet qui pourrait être en cours.

Une fois qu’un pilote appelle ExDeleteTimer, cette routine effectue plusieurs étapes pour s’assurer qu’elle peut supprimer l’objet minuteur en toute sécurité. Tout d’abord, ExDeleteTimer marque l’objet du minuteur comme désactivé pour empêcher le pilote de démarrer une nouvelle opération de minuteur qui utilise l’objet. Une fois l’objet minuteur désactivé, un appel à la routine ExSetTimer ou ExCancelTimer retourne immédiatement FALSE et n’effectue aucune opération. En outre, un deuxième appel à ExDeleteTimer retourne FALSE et n’effectue aucune opération.

Ensuite, ExDeleteTimer vérifie si un minuteur est toujours en attente d’un appel précédent à ExDeleteTimer. La désactivation d’un objet minuteur n’annule pas un minuteur qui a été défini avant la désactivation de l’objet. Dans l’un des deux cas suivants, un minuteur précédemment défini peut expirer après la désactivation de l’objet minuteur :

  • Le minuteur est périodique.
  • Le minuteur est one-shot (ou non ponctuel) et n’a pas encore expiré.

Un minuteur périodique ne peut jamais expirer plus d’une fois après la désactivation de l’objet du minuteur.

Si votre pilote implémente une routine de rappel ExTimerCallback , le paramètre Timer de cette routine est toujours un pointeur valide vers l’objet minuteur (structure de EX_TIMER ), même si le minuteur expire après la désactivation de l’objet minuteur.

Si aucun minuteur n’est en attente, ExDeleteTimer supprime l’objet du minuteur et retourne sans attendre.

Si un minuteur est en attente quand ExDeleteTimer est appelé, les valeurs des paramètres Cancel et Wait que votre pilote fournit à cette routine contrôlent le comportement de la routine. Le paramètre Cancel indique à ExDeleteTimer s’il faut essayer d’annuler un minuteur en attente. Le paramètre Wait indique à ExDeleteTimer s’il faut attendre que l’objet du minuteur soit supprimé.

Si Cancel a la valeur FALSE (auquel cas, Wait doit avoir la valeur FALSE) et qu’un minuteur est en attente, ExDeleteTimer laisse le minuteur expirer avant la suppression de l’objet minuteur. Dans ce cas, ExDeleteTimer marque l’objet minuteur pour indiquer qu’il doit être supprimé après l’expiration du minuteur en attente (et tout dernier rappel à la routine ExTimerCallback se termine). Ensuite, ExDeleteTimer retourne sans attendre que le minuteur finisse d’expirer ou que l’objet soit supprimé.

Si Cancel a la valeur TRUE, ExDeleteTimer tente d’annuler un minuteur en attente avant son expiration. ExDeleteTimer retourne TRUE s’il annule correctement le minuteur. ExDeleteTimer retourne FALSE s’il ne peut pas annuler le minuteur, ce qui est le cas pour un minuteur one-shot qui a déjà expiré ou est en cours d’expiration. ExDeleteTimer retourne également FALSE si le minuteur (one-shot ou périodique) a été annulé avant l’appel ExDeleteTimer ou si le minuteur n’a jamais été défini.

Si Cancel a la valeur TRUE et Wait a la valeur FALSE, ExDeleteTimer ne bloque jamais le thread appelant. Si l’objet minuteur ne peut pas être supprimé immédiatement, ExDeleteTimer marque l’objet du minuteur pour indiquer qu’il doit être supprimé une fois le minuteur en attente arrivé à expiration et retourne immédiatement sans attendre que le minuteur expire ou que l’objet soit supprimé.

Si Cancel et Wait ont la valeur TRUE, ExDeleteTimer bloque le thread appelant si l’objet du minuteur ne peut pas être supprimé immédiatement. ExDeleteTimer attend, si nécessaire, que le minuteur termine son expiration et que tout rappel à une routine ExTimerCallback implémentée par le pilote se termine. Ensuite, ExDeleteTimer supprime l’objet minuteur et appelle la routine ExTimerDeleteCallback , si le pilote implémente cette routine. Enfin, ExDeleteTimer retourne.

Un pilote peut appeler ExDeleteTimer à partir de la routine ExTimerCallback du pilote, qui s’exécute à IRQL = DISPATCH_LEVEL, mais le pilote doit définir le paramètre Wait dans cet appel sur FALSE.

En option, un pilote peut implémenter une routine de rappel ExTimerDeleteCallback qui s’exécute après la suppression d’un objet minuteur. En règle générale, une routine ExTimerDeleteCallback libère toutes les ressources système que le pilote a allouées à utiliser avec l’objet minuteur.

ExDeleteTimer planifie l’exécution d’une routine ExTimerDeleteCallback implémentée par le pilote après la suppression de l’objet du minuteur, à laquelle le pointeur vers cet objet n’est plus valide. Si le paramètre Wait a la valeur TRUE dans l’appel ExDeleteTimer, le rappel à la routine ExTimerDeleteCallback se termine avant le retour d’ExDeleteTimer. Si Wait a la valeur FALSE, la routine ExTimerDeleteCallback peut s’exécuter avant ou après le retour d’ExDeleteTimer.

Pour plus d’informations, consultez Routines du minuteur ExXxxet objets EX_TIMER.