Удаление объекта таймера System-Allocated
Начиная с Windows 8.1 подпрограмма ExDeleteTimer удаляет объект таймера, созданный подпрограммой ExAllocateTimer. Этот объект таймера представляет собой структуру , выделенную системой EX_TIMER, члены которой непрозрачны для драйверов. Перед удалением объекта таймера ExDeleteTimer отключает дальнейшие операции таймера с объектом, а также отменяет или завершает все ожидающие операции с объектом, которые могут выполняться.
После того как драйвер вызывает ExDeleteTimer, эта подпрограмма выполняет несколько действий, чтобы убедиться, что он может безопасно удалить объект таймера. Во-первых, ExDeleteTimer помечает объект таймера как отключенный, чтобы предотвратить запуск новой операции таймера, которая использует объект . После отключения объекта таймера вызов подпрограммы ExSetTimer или ExCancelTimer немедленно возвращает значение FALSE и не выполняет никаких операций. Кроме того, второй вызов ExDeleteTimer возвращает значение FALSE и не выполняет никаких операций.
Затем ExDeleteTimer проверяет, находится ли таймер в ожидании предыдущего вызова ExDeleteTimer. Отключение объекта таймера не отменяет таймер, заданный до отключения объекта. В любом из следующих двух случаев срок действия заданного ранее таймера может истечь после отключения объекта таймера:
- Таймер является периодическим.
- Таймер является одноразовым (или непериодическим) и еще не истек.
Срок действия периодического таймера никогда не может истечь более одного раза после отключения объекта таймера.
Если драйвер реализует подпрограмму обратного вызова ExTimerCallback , параметр Timer для этой подпрограммы всегда будет допустимым указателем на объект таймера ( структура EX_TIMER ), даже если срок действия таймера истекает после отключения объекта таймера.
Если таймер не находится в состоянии ожидания, ExDeleteTimer удаляет объект таймера и возвращается без ожидания.
Если таймер находится в состоянии ожидания при вызове ExDeleteTimer , то значения параметров Cancel и Wait , предоставляемые драйвером для этой подпрограммы, управляют поведением подпрограммы. Параметр Cancel сообщает ExDeleteTimer , следует ли отменить ожидающий таймер. Параметр Wait сообщает ExDeleteTimer , следует ли ждать возврата, пока объект таймера не будет удален.
Если значение Cancel имеет значение FALSE (в этом случае значение Wait должно иметь значение FALSE), а таймер находится в состоянии ожидания, ExDeleteTimer позволяет истечь таймер до удаления объекта таймера. В этом случае ExDeleteTimer помечает объект таймера, чтобы указать, что он должен быть удален после истечения срока действия ожидающего таймера (и завершается любой последний вызов подпрограммы ExTimerCallback ). Затем ExDeleteTimer возвращается, не дожидаясь истечения срока действия таймера или удаления объекта.
Если параметр Cancel имеет значение TRUE, ExDeleteTimer пытается отменить ожидающий таймер до истечения срока его действия. ExDeleteTimer возвращает значение TRUE , если таймер успешно отменен. ExDeleteTimer возвращает значение FALSE , если не удается отменить таймер, что относится к однократным таймерам, срок действия которого уже истек или находится в процессе истечения срока действия. ExDeleteTimer также возвращает значение FALSE , если таймер (однократный или периодический) был отменен до вызова ExDeleteTimer или если таймер не был задан.
Если параметр Cancel имеет значение TRUE , а Wait имеет значение FALSE, ExDeleteTimer никогда не блокирует вызывающий поток. Если объект таймера не может быть немедленно удален, ExDeleteTimer помечает объект таймера, указывая, что он должен быть удален после истечения срока действия ожидающего таймера, и возвращается немедленно, не дожидаясь истечения срока действия таймера или удаления объекта.
Если значения Cancel и Wait имеют значение TRUE, ExDeleteTimer блокирует вызывающий поток, если объект таймера не может быть немедленно удален. ExDeleteTimer при необходимости ожидает окончания истечения срока действия таймера и завершения любого обратного вызова реализованной драйвером подпрограммы ExTimerCallback . Затем ExDeleteTimer удаляет объект таймера и вызывает подпрограмму ExTimerDeleteCallback , если драйвер реализует эту подпрограмму. Наконец, возвращается ExDeleteTimer .
Драйвер может вызывать ExDeleteTimer из подпрограммы ExTimerCallback драйвера, которая выполняется в IRQL = DISPATCH_LEVEL, но драйвер должен задать для параметра Wait в этом вызове значение FALSE.
В качестве варианта драйвер может реализовать подпрограмму обратного вызова ExTimerDeleteCallback , которая выполняется после удаления объекта таймера. Как правило, подпрограмма ExTimerDeleteCallback освобождает все системные ресурсы, выделенные драйвером для использования с объектом таймера.
ExDeleteTimer планирует выполнение подпрограммы ExTimerDeleteCallback , реализованной драйвером, после удаления объекта таймера, после чего указатель на этот объект становится недействительным. Если параметр Wait имеет значение TRUE в вызове ExDeleteTimer , обратный вызов подпрограммы ExTimerDeleteCallback завершается до возврата ExDeleteTimer . Если значение Wait имеет значение FALSE, подпрограмма ExTimerDeleteCallback может выполняться до или после возврата ExDeleteTimer .
Дополнительные сведения см. в разделе Подпрограммы таймера и объекты EX_TIMER.