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




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


Как и все другие DPC процедуры, CustomTimerDpc работает на уровне IRQL равном DISPATCH_LEVEL. В таблице 10.22 описан прототип ее вызова. Следует обратить внимание на то, что эта процедура получает два зарезервированных параметра, значение которых на настоящий момент еще не определено.

Таблица 10.22. Прототип CustomTimerDpc

VOID CustomTimerDpc IRQL == любой
Параметры Описание
IN PKDPC pDpc DPC объект, инициализировавший вызов
IN PVOID pContext Контекст, указанный в вызове KeInitializeDpc

при инициализации данной функции как DPC процедуры

IN PVOID SystemArg1 Зарезервирован
IN PVOID SystemArg2 Зарезервирован
Возвращаемое значение void

Работа с процедурой CustomTimerDpc достаточно проста. Следует выполнить следующие действия:

  • Получить область в нестраничной памяти (возможно, запомнить полученный указатель в структуре расширения объекта устройства) для объекта KDPC, например, при помощи вызова ExAllocatePool.
  • Выполнить, например, во время работы AddDevice, вызов KeInitializeDpc

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

  • Для того чтобы отменить срабатывание активного таймера используется вызов KeCancelTimer

    (прототип описан в таблице 10.24). Этот же вызов может остановить работу "многократного" таймера и, соответственно, вызовы процедуры CustomTimerDpc. Следует обратить внимание, что освобождать память, занятую под объектом таймера или объектом DPC следует только после вызова KeCancelTimer &#8212 нарушение этого правила легко приводит к краху системы. Для определения, истекло ли время ожидания таймера, можно использовать вызов KeReadStateTimer

    (см. таблицу 10.25).

    Таблица 10.23. Прототип вызова KeInitializeDpc

    VOID KeInitializeDpc IRQL == PASSIVE_LEVEL
    Параметры Описание
    IN PKDPC pDpc DPC объект, для которого инициатор данного вызова предоставил область памяти.
    IN PKDIFERRED_ROUTINE DeferredProcedure Указатель на процедуру, которая будет вызываться в момент извлечения объекта DPC из очереди, в данном случае&#8212 CustomTimerDpc
    IN PVOID pContext Контекстный указатель, передаваемый вызываемой DPC процедуре, в данном случае &#8212 CustomTimerDpc
    Возвращаемое значение void
    <


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