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


Функция KeAcquireInStackQueuedSpinLock (wdm.h)

Программа KeAcquireInStackQueuedSpinLock получает очередь спин-блокировку.

Синтаксис

void KeAcquireInStackQueuedSpinLock(
  PKSPIN_LOCK         SpinLock,
  PKLOCK_QUEUE_HANDLE LockHandle
);

Параметры

SpinLock

[in, out] Указывает блокировку спина для получения. Этот параметр должен быть инициализирован с помощью KeInitializeSpinLock.

LockHandle

[out] Указатель на указанную вызывающим KLOCK_QUEUE_HANDLE переменную, которую подпрограмма может использовать для возврата дескриптора очереди блокировки спина. Вызывающий объект передает это значение KeReleaseInStackQueuedSpinLock при освобождении блокировки. Драйверы обычно должны выделять структуру в стеке каждый раз, когда они получают блокировку. Драйвер не должен использовать один и тот же KLOCK_QUEUE_HANDLE из нескольких вызывающих сайтов.

Возвращаемое значение

Никакой

Замечания

KeAcquireInStackQueuedSpinLock получает спин-блокировку в виде очереди спин-блокировки. Дополнительные сведения см. в очередных блокировок спина. Вызывающий вызывает блокировку спина, вызывая подпрограмму KeReleaseInStackQueuedSpinLock.

Как и обычные замки спина, очереди замков спина должны использоваться только в очень особых обстоятельствах. Описание использования блокировок спина см. в разделе KeAcquireSpinLock.

Эта подпрограмма повышает уровень IRQL до DISPATCH_LEVEL при получении блокировки спина. Если вызывающий объект гарантированно работает в DISPATCH_LEVEL, более эффективно вызывать KeAcquireInStackQueuedSpinLockAtDpcLevel.

Вызов KeReleaseInStackQueuedSpinLock, который освобождает блокировку спина, должен происходить в IRQL = DISPATCH_LEVEL. Этот вызов восстанавливает исходный IRQL, сохраненный операционной системой в начале вызова KeAcquireInStackQueuedSpinLock. Если драйвер получает несколько блокировок спина в очереди в ряде, он должен освободить их в обратном порядке, чтобы правильно восстановить исходный IRQL.

Драйверы не должны объединять вызовы к KeAcquireSpinLock и KeAcquireInStackQueuedSpinLock в той же блокировке спина. Блокировка спина всегда должна быть приобретена или освобождена как очередь спин-блокировки или как обычная блокировка спина.

Требования

Требование Ценность
заголовка wdm.h (include Wdm.h)
IRQL IRQL <= DISPATCH_LEVEL
правил соответствия DDI HwStorPortProhibitedDDIs(storport), MarkingQueuedIrps(wdm), QueuedSpinLock(storport), QueuedSpinLock(wdm), QueuedSpinLockRelease(storport), QueuedSpinLockRelease(wdm)

См. также

KLOCK_QUEUE_HANDLE

KeAcquireInStackQueuedSpinLockAtDpcLevel

KeAcquireSpinLock

KeInitializeSpinLock

KeReleaseInStackQueuedSpinLock