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


Интервалы ожидания для отдельного потока - часть 3


Поскольку функция IoTimerRoutine при вызове будет получать указатель на объект устройства (из которого можно легко определить местоположение структуры расширения объекта устройства), то необходимые контекстные параметры можно разместить и в расширении устройства, в частности счетчик вызовов. Подробнее вопросы подсчета односекундных интервалов будут обсуждены ниже.

Таблица 10.10. Прототип функции обратного вызова IoTimerRoutine

VOID IoTimerRoutine IRQL == DISPATCH_LEVEL
Параметры Callback-функция, вызываемая через 1 сек. интервал
IN PDEVICE_OBJECT pDeviceObject Указатель на объект устройства, с которым соотнесена данная функция
IN PVOID pContext Контекстный аргумент
Возвращаемое значение void

Собственно создание функции IoTimerRoutine и ее регистрация при помощи вызова IoInitializeTimer еще не приводят к работе таймера и периодическим вызовам IoTimerRoutine.

Если внимательно присмотреться к структуре DEVICE_OBJECT, то несложно заметить, что поле "PIO_TIMER Timer" в этой структуре единственное. Это недвусмысленно подразумевает, что более одной функций IoTimerRoutine для данного устройства использовать просто невозможно, хотя ничто не запрещает использовать одну callback-функцию IoTimerRoutine c несколькими объектами устройств.

Для запуска таймера, ассоциированного с callback-функцией IoTimerRoutine, используется вызов IoStartTimer. Останавливается таймер вызовом IoStopTimer.

Таблица 10.11. Прототип функции обратного вызова IoStartTimer

VOID IoStartTimer IRQL&#60=DISPATCH_LEVEL
Параметры Запуск таймера, в результате чего callback-функция IoTimerRoutine, соотнесенная с данным объектом устройства будет вызываться каждую секунду
IN PDEVICE_OBJECT pDeviceObject Указатель на объект устройства, с которым соотнесен таймер, который следует запустить
Возвращаемое значение void

Таблица 10.12. Прототип функции обратного вызова IoStopTimer

VOID IoStopTimer IRQL&#60=DISPATCH_LEVEL
Параметры Остановка таймера
IN PDEVICE_OBJECT pDeviceObject Указатель на объект устройства, с которым соотнесен таймер, который следует остановить
Возвращаемое значение void
<


Начало  Назад  Вперед