Макрос 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 как можно быстрее.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Доступно начиная с 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) |