Процедуры поддержки вызовов, использующие спин-блокировки
Вызов KeAcquireSpinLock или KeAcquireInStackQueuedSpinLock задает значение IRQL на текущем процессоре DISPATCH_LEVEL до тех пор, пока соответствующий вызов KeReleaseSpinLock или KeReleaseInStackQueuedSpinLock не восстановит предыдущий IRQL. Таким образом, драйверы должны выполняться в среде IRQL <= DISPATCH_LEVEL при вызове KeAcquireSpinLock или KeAcquireInStackQueuedSpinLock.
Вызывающие методы KeAcquireSpinLockAtDpcLevel, KeAcquireInStackQueuedSpinLockAtDpcLevel, KeReleaseInStackQueuedSpinLockFromDpcLevel и KeReleaseSpinLockFromDpcLevel выполняются быстрее, так как они уже работают в IRQL = DISPATCH_LEVEL поэтому этим подпрограммам поддержки не нужно сбрасывать IRQL на текущем процессоре. Таким образом, на большинстве платформ Windows вызов KeAcquireSpinLockAtDpcLevel или KeAcquireInStackQueuedSpinLockAtDpcLevel при выполнении в IRQL менее DISPATCH_LEVEL является неустранимой ошибкой. Также возникает ошибка при освобождении блокировки спина, полученной с помощью KeAcquireSpinLock путем вызова KeReleaseSpinLockFromDpcLevel , так как исходный IRQL вызывающего объекта не восстанавливается.
Подпрограммы, которые содержат блокировку спина руководителя, например ExInterlockedXxx, обычно выполняются в IRQL = DISPATCH_LEVEL до тех пор, пока не отпустят блокировку спина и не вернут управление вызывающей стороны. Однако подпрограмма Прерывание Службы драйвера и процедуры SynchCritSection (которые выполняются в DIRQL) могут вызывать определенные подпрограммы ExInterlockedXxx, такие как процедуры ExInterlockedXxxList, при условии, что спин-блокировка, переданная подпрограмме, используется исключительно подпрограммами ISR и SynchCritSection.
Каждая подпрограмма, содержащая блокировку спина прерывания, выполняется в DIRQL связанного набора объектов прерывания. Таким образом, драйвер не должен вызывать KeAcquireSpinLock и KeReleaseSpinLock , а также любую другую процедуру, которая использует исполнительную спин-блокировку из процедур ISR или SynchCritSection . Такой вызов является ошибкой, которая может привести к взаимоблокировке системы, требующей перезагрузки компьютера. Обратите внимание, что если подпрограмма ISR или SynchCritSection драйвера вызывает подпрограмму ExInterlockedXxxList , драйвер не может повторно использовать спин-блокировку, которую он передает подпрограммам ExInterlockedXxx XxxList в вызовах к подпрограммам поддержки KeXxxSpinLock или KeXxxSpinLockXxxDpcLevel .
Если драйвер имеет многовекторный ISR или несколько ISR, его подпрограммы могут вызывать KeSynchronizeExecution при выполнении в любом IRQL до значения SynchronizeIrql , указанного для связанных объектов прерывания при их подключении.