Поделиться через


Включение и отключение прерываний

Если драйвер обрабатывает прерывания устройства, он должен предоставить функции обратного вызова EvtInterruptEnable и EvtInterruptDisable, которые позволяют и отключают прерывания. Как правило, эти функции обратного вызова выполняются на уровне DIRQL устройства и должны выполнять все необходимые действия для включения и отключения механизма прерывания устройства. Для пассивных прерываний уровня эти функции обратного вызова выполняются на уровне IRQL = PASSIVE_LEVEL при держании блокировки пассивного уровня прерываний.

Если драйвер должен выполнять дополнительные операции, связанные с включением или отключением прерываний, и если эти дополнительные операции не могут выполняться на уровне IRQL = DIRQL, драйвер также может предоставлять EvtDeviceD0EntryPostInterruptsEnabled и EvtDeviceD0ExitPreInterruptsDisabled функции обратных вызовов. Эти две функции обратного вызова выполняются в IRQL = PASSIVE_LEVEL без блокировки прерываний и могут вызывать методы объектов фреймворка, недоступные в IRQL = DIRQL.

Фреймворк вызывает функции обратного вызова драйвера EvtInterruptEnable и EvtDeviceD0EntryPostInterruptsEnabled при каждом входе устройства в рабочее состояние (D0), после вызова функции обратного вызова драйвера EvtDeviceD0Entry.

Фреймворк вызывает функции обратного вызова драйвера EvtDeviceD0ExitPreInterruptsDisabled и EvtInterruptDisable каждый раз, когда устройство выходит из рабочего состояния, перед вызовом функции обратного вызова драйвера EvtDeviceD0Exit. Дополнительные сведения о том, когда платформа вызывает функции обратного вызова драйвера, см. в сценариях управления питанием и PnP.

Не следует предположить, что устройство будет использовать одни и те же ресурсы прерывания каждый раз, когда платформа вызывает функцию обратного вызова драйвера EvtInterruptEnable. Иногда диспетчер PnP перераспределяет системные ресурсы, и он может назначить новые ресурсы прерывания вашему устройству.

Драйвер может вызывать WdfInterruptGetInfo для определения ресурсов прерывания устройства. Драйвер может вызывать WdfInterruptGetDevice, чтобы определить устройство, к которому принадлежит объект прерывания. (Несколько драйверов могут вызывать WdfInterruptWdmGetInterrupt.)

Чтобы включить и отключить прерывания напрямую, драйвер может вызывать методы объекта прерывания WdfInterruptEnable и WdfInterruptDisable, которые вызывают функции обратного вызова событий драйвера EvtInterruptEnable и EvtInterruptDisable. Однако большинство драйверов должны просто разрешить платформе вызывать функции обратного вызова EvtInterruptEnable и EvtInterruptDisable в надлежащее время.