Обслуживание прерывания
В этом разделе описывается обслуживание прерывания DIRQL. Сведения об обслуживании прерываний пассивного уровня см. в разделе Поддержка прерываний пассивного уровня.
Обслуживание прерывания состоит из двух, а иногда и трех этапов:
Быстрое сохранение непостоянной информации (например, регистр содержимого) в процедуре прерывания, которая выполняется в IRQL = DIRQL.
Обработка сохраненных переменных данных в отложенном вызове процедуры (DPC), который выполняется в IRQL = DISPATCH_LEVEL.
Выполнение дополнительных работ в IRQL = PASSIVE_LEVEL, если это необходимо.
Когда устройство создает аппаратное прерывание, платформа вызывает подпрограмму обслуживания прерываний драйвера (ISR), которую драйверы на основе платформы реализуют как функцию обратного вызова EvtInterruptIsr .
Функция обратного вызова EvtInterruptIsr , которая выполняется в DIRQL устройства, должна быстро сохранять сведения об прерывании, такие как содержимое регистра, которые будут потеряны в случае другого прерывания.
Как правило, функция обратного вызова EvtInterruptIsr планирует отложенный вызов процедуры (DPC) для обработки сохраненных сведений позже в более низком IRQL (DISPATCH_LEVEL). Драйверы на основе платформы реализуют подпрограммы DPC как функции обратного вызова EvtInterruptDpc или EvtDpcFunc .
Большинство драйверов используют одну функцию обратного вызова EvtInterruptDpc для каждого типа прерывания. Чтобы запланировать выполнение функции обратного вызова EvtInterruptDpc , драйвер должен вызвать WdfInterruptQueueDpcForIsr из функции обратного вызова EvtInterruptIsr .
Если драйвер создает несколько объектов очередей платформы для каждого устройства, можно использовать отдельный объект DPC и функцию обратного вызова EvtDpcFunc для каждой очереди. Чтобы запланировать выполнение функции обратного вызова EvtDpcFunc , драйвер должен сначала создать один или несколько объектов DPC, вызвав WdfDpcCreate, обычно в функции обратного вызова EvtDriverDeviceAdd драйвера. Затем функция обратного вызова EvtInterruptIsr драйвера может вызвать WdfDpcEnqueue.
Драйверы обычно выполняют запросы ввода-вывода в функциях обратного вызова EvtInterruptDpc или EvtDpcFunc .
Иногда драйвер должен выполнять некоторые операции обслуживания прерываний в IRQL = PASSIVE_LEVEL. В таких случаях функция обратного вызова EvtInterruptDpc или EvtDpcFunc драйвера, выполняющаяся в IRQL = DISPATCH_LEVEL, может запланировать выполнение одного или нескольких рабочих элементов платформы, которые выполняются в IRQL = PASSIVE_LEVEL.
Пример драйвера, использующего рабочие элементы при обслуживании прерываний устройства, см. в примере драйвера PCIDRV .