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


Макрос KeAcquireSpinLock (wdm.h)

Программа KeAcquireSpinLock получает блокировку спина, чтобы вызывающий объект смог синхронизировать доступ к общим данным в многопроцессорном режиме, вызвав IRQL.

Синтаксис

void KeAcquireSpinLock(
   SpinLock,
   OldIrql
);

Параметры

SpinLock

Указатель на инициализированную KSPIN_LOCK блокировку спина, для которой вызывающий объект предоставляет хранилище.

OldIrql

Указатель на переменную KIRQL, заданную текущим IRQL при выполнении этого вызова.

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

Никакой

Замечания

KeAcquireSpinLock сначала сбрасывает IRQL на DISPATCH_LEVEL, а затем получает блокировку. Предыдущий IRQL записывается в OldIrql после получения блокировки.

Значение OldIrql необходимо указать, когда блокировка спина освобождается с KeReleaseSpinLock.

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

Замки спина могут вызвать серьезные проблемы, если не используется разумно. В частности, защита от взаимоблокировки не выполняется, а диспетчеризация отключена во время блокировки спина. Следовательно:

  • Код в критическом регионе, защищенном блокировкой спина, не должен быть разыгрываемым и не выполнять ссылки на страницы данных.
  • Код в критическом регионе, защищенном блокировкой спина, не может вызывать любую внешнюю функцию, которая может получить доступ к страничных данных или вызвать исключение, а также не может создавать исключения.
  • Вызывающий объект должен освободить блокировку спина с KeReleaseSpinLock как можно быстрее.
Попытка получить рекурсивную блокировку спина гарантированно вызывает взаимоблокировку. Дополнительные сведения о блокировках спина см. в разделе Spin Locks.

Требования

Требование Ценность
минимальные поддерживаемые клиентские Доступно начиная с Windows 2000.
целевая платформа Всеобщий
заголовка wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
библиотеки Hal.lib
IRQL <= DISPATCH_LEVEL
правил соответствия DDI HwStorPortProhibitedDDIs(storport), IrqlKeDispatchLte(wdm), MarkingQueuedIrps(wdm), ReqSendTimeSpinlock(kmdf), Spinlock(kmdf), Spinlock(kmdf), SpinLock(storport), SpinLock(storport), SpinLock(wdm), SpinlockDpc(kmdf), SpinlockDpc(kmdf), SpinLockDpc(storport), SpinLockDpc(storport)), SpinLockDpc(wdm), SpinlockRelease(kmdf), SpinlockRelease(kmdf), SpinLockRelease(storport), SpinLockRelease(storport), SpinlockRelease(wdm), SpinLockSafe(storport), SpinLockSafe(storport), SpinLockSafe(wdm)

См. также

KeAcquireInStackQueuedSpinLock

KeAcquireSpinLockAtDpcLevel

KeInitializeSpinLock

KeReleaseSpinLock