Функция 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) |