KeAcquireSpinLock 매크로(wdm.h)

KeAcquireSpinLock 루틴은 호출자가 IRQL을 발생시켜 다중 프로세서로부터 안전한 방식으로 공유 데이터에 대한 액세스를 동기화할 수 있도록 스핀 잠금을 획득합니다.

구문

void KeAcquireSpinLock(
   SpinLock,
   OldIrql
);

매개 변수

SpinLock

호출자가 스토리지를 제공하는 초기화된 KSPIN_LOCK 스핀 잠금에 대한 포인터입니다.

OldIrql

이 호출이 발생할 때 현재 IRQL로 설정된 KIRQL 변수에 대한 포인터입니다.

반환 값

없음

설명

KeAcquireSpinLock 은 먼저 IRQL을 DISPATCH_LEVEL 다시 설정한 다음 잠금을 획득합니다. 이전 IRQL은 잠금을 획득한 후 OldIrql 에 기록됩니다.

KeReleaseSpinLock을 사용하여 스핀 잠금을 해제할 때 OldIrql 값을 지정해야 합니다.

대부분의 드라이버는 지역 변수를 사용하여 이전 IRQL 값을 저장합니다. 드라이버는 전역 변수와 같은 공유 메모리 위치를 사용할 수도 있지만 드라이버는 두 개의 다른 잠금에 동일한 위치를 사용하면 안 됩니다. 그렇지 않으면 경합 상태가 발생할 수 있습니다.

스핀 잠금은 신중하게 사용하지 않으면 심각한 문제를 일으킬 수 있습니다. 특히 교착 상태 보호가 수행되지 않으며 스핀 잠금이 유지되는 동안 디스패치를 사용할 수 없습니다. 따라서

  • 스핀 잠금으로 보호되는 중요한 지역 내의 코드는 페이지 가능하거나 페이지 가능한 데이터에 대한 참조를 수행해서는 안 됩니다.
  • 스핀 잠금으로 보호되는 중요한 지역 내의 코드는 페이지 가능한 데이터에 액세스하거나 예외를 발생시키는 외부 함수를 호출할 수 없으며 예외를 생성할 수도 없습니다.
  • 호출자는 KeReleaseSpinLock 을 사용하여 스핀 잠금을 가능한 한 빨리 해제해야 합니다.
스핀 잠금을 재귀적으로 획득하려고 하면 교착 상태가 발생합니다. 스핀 잠금에 대한 자세한 내용은 스핀 잠금을 참조하세요.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 2000부터 사용할 수 있습니다.
대상 플랫폼 유니버설
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)
라이브러리 Hal.lib
IRQL <= DISPATCH_LEVEL
DDI 규정 준수 규칙 HwStorPortProhibitedDDIs(storport), IrqlKeDispatchLte(wdm), MarkingQueuedIrps(wdm), ReqSendWhileSpinlock(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