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

       

Выполнения кода процедуры DpcForIsr


В ответ на выполненный ISR процедурой вызов IoRequestDpc, принадлежащая данному драйверу процедура DpcForIsr добавляется в очередь DPC объектов (DPC dispatch queue). Когда значение процессорного IRQL падает ниже DISPATCH_LEVEL, диспетчер процедур обработки отложенных вызовов выполняет вызов DpcForIsr данного драйвера. Процедура DpcForIsr выполняется на уровне DISPATCH_LEVEL, что означает: она не должна работать с адресами страничной памяти.

Диспетчер ввода/вывода игнорирует множественные вызовы IoRequestDpc

для данного объекта устройства до начала выполнения DpcForIsr. Попытки повторно поместить объект DPC в очередь отклоняются. Это является нормальным отношением ко всем DPC объектам. В случае если логика работы драйвера такова, что он может выдавать перекрывающиеся DPC запросы для одного и того же устройства, и их следует учитывать, то такой драйвер должен реализовать собственную очередь DPC запросов (объектов).

Перечень обязанностей типовой процедуры DpcForIsr может включать:

  • Установку данных в блоке IoStatus данного пакета IRP, то есть размещение нужного кода STATUS_XXX в поле Status и числа действительно переданных байт данных в поле Information.
  • Выполнение вызова IoCompleteRequest для завершения обработки пакета IRP с соответствующим повышением приоритета. Будучи однажды вызван, пакет IRP не должен обрабатываться снова.
  • Выполнение вызова IoStartNextPacket &#8212 чтобы инициировать поступление следующего IRP пакета в процедуру StartIO.
  • VOID DpcForIsr( PKDPC Dpc, PDEVICE_OBJECT pDevObject, PIRP junk, PDEVICE EXTENSION pDevExtension) { // Неким образом получаем текущий IRP (например, из очереди // queueReadWrite, которую поддерживает сам драйвер): PIRP pIrp = GetCurrentIrp(&pDevExtension-&#62queueReadWrite);

    // Инициируем поступление IRP из внутренней очереди в // в процедуру StartIO(): TodoStartNextPacket(&pDevExtension-&#62dqReadWrite, pDevObject)

    // Даем возможность отработать процедурам завершения всех // вышестоящий драйверов, если они есть: IoCompleteRequest(pIrp, IO_NO_INCREMENT); }



    Содержание раздела