функция обратного вызова EVT_WDF_INTERRUPT_ISR (wdfinterrupt.h)
[Применимо к KMDF и UMDF]
Функция обратного вызова события EvtInterruptIsr драйвера обслуживает аппаратное прерывание.
Синтаксис
EVT_WDF_INTERRUPT_ISR EvtWdfInterruptIsr;
BOOLEAN EvtWdfInterruptIsr(
[in] WDFINTERRUPT Interrupt,
[in] ULONG MessageID
)
{...}
Параметры
[in] Interrupt
Дескриптор объекта прерывания платформы.
[in] MessageID
Если устройство использует прерывания с сигналом сообщения (MSIs), этот параметр является номером сообщения, который идентифицирует сообщение о прерывании оборудования устройства. В противном случае это значение равно 0.
Возвращаемое значение
Функция обратного вызова EvtInterruptIsr должна возвращать значение TRUE , если функция обслуживает аппаратное прерывание. В противном случае эта функция должна возвращать значение FALSE.
Комментарии
Чтобы зарегистрировать функцию обратного вызова EvtInterruptIsr , драйвер должен поместить адрес функции обратного вызова в структуру WDF_INTERRUPT_CONFIG перед вызовом WdfInterruptCreate.
Функция обратного вызова EvtInterruptIsr — это подпрограмма службы прерываний драйвера на основе платформы, которая вызывается при прерывании оборудования.
Если прерывание происходит не от оборудования, на которое эта функция обратного вызова EvtInterruptIsr работает, драйвер должен возвращать значение FALSE. Если вектор прерывания является общим, система вызывает другую подпрограмму службы прерываний.
Если драйвер не запросил обработку пассивного уровня для объекта прерывания, то перед вызовом функции обратного вызова EvtInterruptIsr платформа вызывает IRQL процессора в IRQL устройства (DIRQL) и получает спин-блокировку, указанную драйвером в структуре WDF_INTERRUPT_CONFIG объекта прерывания.
Так как функция обратного вызова EvtInterruptIsr выполняется на относительно высоком уровне IRQL, она может вызывать очень немногие методы объекта платформы или системные подпрограммы. Кроме того, эта функция обратного вызова не может получить доступ к страничним коду .
Как правило, функция обратного вызова EvtInterruptIsr очищает аппаратные прерывания и сохраняет любые сведения, которые могут быть потеряны после возврата функции обратного вызова, а система понижает IRQL (так как снижение IRQL позволяет выполнять дополнительные прерывания). Драйверы на основе платформы сохраняют сведения о прерывании в контекстном пространстве объекта прерывания.
Драйверы обычно предоставляют функцию обратного вызова EvtInterruptDpc для обработки сохраненных сведений на более низком уровне IRQL. (Несколько драйверов предоставляют одну или несколько функций обратного вызова EvtDpcFunc вместо функции обратного вызова EvtInterruptDpc .) Сведения о планировании функции обратного вызова EvtInterruptDpc для выполнения см. в разделе Обслуживание прерывания.
Функция обратного вызова EvtInterruptIsr должна иметь возможность обслуживать несколько прерываний перед выполнением функции обратного вызова EvtInterruptDpc . Поэтому драйверу может потребоваться хранить данные о прерываниях из нескольких прерываний, а функции обратного вызова EvtInterruptIsr иEvtInterruptDpc могут определить, какие данные прерываний были полностью обработаны драйвером, а какие нет.
Начиная с kmdf версии 1.11, драйвер может обеспечить обработку прерываний пассивного уровня. Если драйвер запросил обработку пассивного уровня для объекта прерывания, то перед вызовом функции обратного вызова EvtInterruptIsr этого прерывания в IRQL = PASSIVE_LEVEL платформа получает блокировку прерывания пассивного уровня, настроенную драйвером в WDF_INTERRUPT_CONFIG структуре объекта прерывания. Как и при обработке прерываний в DIRQL, функция EvtInterruptIsr драйвера по-прежнему должна сохранять сведения о прерывании для последующей обработки.
Драйверы, поддерживающие обработку прерываний пассивного уровня, могут предоставлять функцию обратного вызова EvtInterruptWorkItem или EvtInterruptDpc для обработки сохраненных данных.
Дополнительные сведения об обработке прерываний в драйверах на основе платформы см. в разделе Обработка аппаратных прерываний.
Требования
Требование | Значение |
---|---|
Целевая платформа | Универсальное |
Минимальная версия KMDF | 1,0 |
Минимальная версия UMDF | 2,0 |
Верхняя часть | wdfinterrupt.h (включая Wdf.h) |
IRQL | (См. раздел примeчаний). |