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



Обслуживание прерываний - часть 4


  • Определить, относится ли поступившее прерывание к данному драйверу. Если не относится &#8212 немедленно возвратить FALSE.
  • Выполнить все операции над устройством, необходимые для того, чтобы подтвердить устройству получение прерывания.
  • Определить, существует ли необходимость в передаче данных и дополнительных действиях, которые могут быть выполнены на низких уровнях IRQL. Если такая работа имеется, то следует запланировать вызов DPC процедуры (предоставляемой драйвером), то есть поставить в очередь DPC-запрос вызовом IoRequestDpc.
  • Возвратить значение TRUE.
  • Таблица 8.12. Прототип вызова IoRequestDpc

    VOID IoRequestDpc IRQL == DIRQL
    Параметры Помещает DPC вызов в очередь
    IN PDEVICE_OBJECT pDevObject Объект устройства, для которого зарегистрирована DPC процедура
    IN PIRP pIrp Указатель на интересующий IRP пакет
    IN VOID pServiceContext Контекстный аргумент
    Возвращаемое значение void

    Если сравнить прототип ISR процедуры и прототип вызова IoRequestDpc, который делается из ISR процедуры для планирования последующего вызова DPC процедуры (для завершения работы над прерыванием), то становится очевидной проблема.

    Обычно рабочие процедуры драйвера получают указатель на объект устройства и указатель на адресованный этому объекту IRP пакет через заголовок при вызове. Но прототип ISR процедур этого не предусматривает. Как же тогда сделать из нее вызов IoRequestDpc, чтобы запланировать DPC процедуру?

    Данное затруднение решается, если при регистрации ISR процедуры вызовом IoConnectInterrupt

    в качестве контекстного аргумента pServiceContext ввести указатель на структуру расширения структуры (извините за неблагозвучные повторы) данного объекта устройства, то есть указатель на DEVICE_EXTENSION. При условии заблаговременного сохранения там указателя на объект устройства (например, как это было сделано в DriverEntry примера главы 3) процедура ISR драйвера не будет испытывать затруднения с тем, откуда ей взять данный указатель.

    Остается вопрос, что такое pIrp и где его найти?




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