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

Если драйвер обрабатывает прерывания устройства, он должен предоставить функции обратного вызова 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 в нужное время.