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

Процедуры SynchCritSection


Обслуживание прерывания происходит на одном из уровней аппаратных DIRQL (что зависит от типа устройства), в то время как весь остальной код драйвера работает на уровне приоритетов не выше DISPATCH_LEVEL. В случае, если когда-либо этому относительно низкоприоритетному коду понадобится поработать с ресурсами, которые использует и ISR (процедура обслуживания прерываний) драйвера, то эти действия должны выполняться только внутри callback процедуры SynchCritSection. Тот программный код, которому хочется корректно обратиться к ресурсам, что, возможно, затребует неожиданно вступившая в права высокоприоритетная процедура обслуживания прерываний, должен воспользоваться посредническими услугами callback процедуры SynchCritSection. Запустить эту callback процедуру необходимо вызовом KeSynchronizeExecution

из программного кода, который работает на любом из уровней не выше DIRQL прерывания. Сама процедура SynchCritSection будет работать с приоритетом прерывания, поэтому пребывание внутри ее кода следует минимизировать (постоянное требование для кода высоких уровней IRQL).

Таким образом, фрагмент кода с изначально низким уровнем IRQL через процедуру обратного вызова получает возможность сделать работу при уровне DIRQL устройства, не опасаясь, что в это время управление будет передано в ISR процедуру. По окончании SynchCritSection прежнее значение IRQL восстанавливается.



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