Подпрограммы и объекты EX_TIMER ExXxxTimer

Начиная с Windows 8.1, для управления таймерами доступен полный набор подпрограмм ExXxxTimer. В этих подпрограммах используются объекты таймера, основанные на структуре EX_TIMER . Подпрограммы ExXxxTimer являются заменой подпрограмм KeXxxTimer , которые доступны начиная с Windows 2000. Драйверы, предназначенные для работы только в Windows 8.1 и более поздних версиях Windows, могут использовать подпрограммы ExXxxTimer вместо подпрограмм KeXxxTimer. Windows 8.1 и более поздних версий Windows по-прежнему поддерживают подпрограммы KeXxxTimer.

Подпрограммы ExXxxTimer имеют все важные возможности, предоставляемые подпрограммами KeXxxTimer . Кроме того, подпрограммы ExXxxTimer поддерживают два типа таймеров: таймеры с высоким разрешением и таймеры без пробуждения, которые не поддерживаются подпрограммами Таймера KeXxx. Таймеры с высоким разрешением — это таймеры, срок действия которых может быть указан с более высокой точностью, чем таймеры, точность которых ограничена разрешением системных часов по умолчанию. Таймеры без пробуждения — это таймеры, которые не позволяют без необходимости пробуждать процессоры из состояний с низким энергопотреблением. Дополнительные сведения см. в следующих разделах:

Таймеры с высоким разрешением

Таймеры без пробуждения

Начиная с Windows 8.1 доступны следующие подпрограммы таймера ExXxx:

ExAllocateTimer

ExSetTimer

ExCancelTimer

ExDeleteTimer

Вместо подпрограммы KeSetTimer или KeSetTimerEx можно использовать подпрограмму ExSetTimer. Вместо процедуры KeCancelTimer можно использовать подпрограмму ExCancelTimer.

Подпрограммы ExAllocateTimer и ExDeleteTimer не имеют прямых аналогов KeXxxTimer . Эти две подпрограммы выделяют и освобождают объект таймера. Этот объект таймера представляет собой структуру , выделенную системой EX_TIMER, члены которой непрозрачны для драйверов. В отличие от этого, объект таймера, используемый подпрограммами KeXxxTimer , является структурой KTIMER , выделенной драйвером. Драйвер вызывает подпрограмму KeInitializeTimer или KeInitializeTimerEx для инициализации этого объекта. ExAllocateTimer инициализирует выделенные объекты таймера. Дополнительные сведения об ExDeleteTimer см. в разделе Удаление объекта System-Allocated таймера.

EX_TIMER и структуры KTIMER являются объектами для ожидания. После того как драйвер вызывает ExSetTimer, KeSetTimer или KeSetTimerEx , чтобы задать таймер, драйвер может вызвать подпрограмму , например KeWaitForSingleObject или KeWaitForMultipleObjects , чтобы дождаться истечения срока действия таймера. Объект таймера получает сигнал по истечении срока действия таймера. В качестве варианта драйвер может указать указатель на реализованную драйвером процедуру обратного вызова ExTimerCallback или CustomTimerDpc , которую операционная система вызывает после истечения срока действия таймера.

Подпрограммы KeXxxTimer имеют две возможности, которые не предоставляются подпрограммами ExXxxTimer , но эти возможности не нужны большинству драйверов.

Во-первых, структура KTIMER, используемая в качестве объекта таймера подпрограммами Таймера KeXxx, выделяется драйвером. Драйвер может предварительно выделить этот объект, чтобы обеспечить его доступность даже в условиях, когда ресурсы ограничены, а выделение памяти может завершиться сбоем. В отличие от этого, вызов ExAllocateTimer для выделения объекта таймера может завершиться ошибкой в среде с ограниченными ресурсами. Однако для работы в средах, в которых выделение памяти завершается сбоем, необходимо спроектировать несколько драйверов, и большинство драйверов получают выгоду от удобства подпрограммы ExAllocateTimer , которая выделяет и инициализирует объект таймера.

Во-вторых, не существует эквивалента exXxxTimerподпрограммы KeReadStateTimer , которая указывает, находится ли объект таймера в состоянии сигнала. Однако эта процедура используется редко. При необходимости драйвер, использующий подпрограммы ExXxxTimer, может проверка, находится ли объект таймера в состоянии сигнала, считывая логическое значение, заданное подпрограммой обратного вызова ExTimerCallback, предоставляемой драйвером подпрограмме ExAllocateTimer.