Программирование драйверов Windows




Таймеры и их использование - часть 4


/p>

Вызов KeWaitForMultipleObjects (также как и описанный выше вызов KeWaitForSingleObject) на уровне IRQL равном DISPATCH_LEVEL следует выполнять только при нулевом значении параметра Timeout.

Вернемся к вопросу использования таймера для организации задержек внутри одного программного потока или для разнесения во времени двух точек в разных программных потоках.

Прежде всего, следует создать объект таймера. Для этого необходимо выделить область памяти и инициализировать ее вызовами KeInitializeTimer

или KeInitializeTimerEx. Выделенная память должна быть резидентна. Иными словами, ее следует выделять в нестраничном пуле, например, вызовом ExAllocatePool.

Таблица 10.18. Прототип вызова KeInitializeTimer

VOID KeInitializeTimer IRQL &#60= DISPATCH_LEVEL
Параметры Инициализирует таймер типа NotificationTimer
IN PKTIMER pTimerObj Указатель на место для объекта таймера, заранее подготовленное инициатором вызова
Возвращаемое значение void

Таблица 10.19. Прототип вызова KeInitializeTimerEx

VOID KeInitializeTimerEx IRQL &#60= DISPATCH_LEVEL
Параметры Инициализирует таймер с указанием типа
IN PKTIMER pTimerObj Указатель на место для объекта таймера, заранее подготовленное инициатором вызова
IN TIMER_TYPE Type NotificationTimer

SynchronizationTimer

Возвращаемое значение void

Таймер типа NotificationTimer запускает выполнение всех потоков, ожидавших его перехода в сигнальное состояние, и остается в сигнальном состоянии до тех пор, пока кто-то не переведет его явным образом (вызовом KeSetTimerEx

или KeSetTimer) в несигнальное.

Иначе ведут себя таймеры типа SynchronizationTimer. По истечении времени ожидания, таймер такого типа переходит в сигнальное состояние и остается в нем, пока не запустится один из ожидающих его программных потоков, после чего таймер автоматически переходит в несигнальное состояние. То есть по истечении интервала ожидания таймер разрешает выполнение одному потоку из числа ожидающих его сигнала.




Содержание  Назад  Вперед