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

Срочный ремонт ноутбуков краснознаменск отличается быстротой и качеством.

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


  1. Определить, относится ли поступившее прерывание к данному драйверу. Если не относится &#8212 немедленно возвратить FALSE.
  2. Выполнить все операции над устройством, необходимые для того, чтобы подтвердить устройству получение прерывания.
  3. Определить, существует ли необходимость в передаче данных и дополнительных действиях, которые могут быть выполнены на низких уровнях IRQL. Если такая работа имеется, то следует запланировать вызов DPC процедуры (предоставляемой драйвером), то есть поставить в очередь DPC-запрос вызовом IoRequestDpc.
  4. Возвратить значение 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 и где его найти?




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