다음을 통해 공유


KeAcquireSpinLock 매크로(wdm.h)

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

통사론

void KeAcquireSpinLock(
   SpinLock,
   OldIrql
);

매개 변수

SpinLock

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

OldIrql

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

반환 값

없음

발언

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

OldIrql 값은 KeReleaseSpinLock스핀 잠금이 해제될 때 지정해야 합니다.

대부분의 드라이버는 지역 변수를 사용하여 이전 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(stor)port), SpinLockDpc(wdm), SpinlockRelease(kmdf), SpinlockRelease(kmdf), SpinLockRelease(storport), SpinLockRelease(storport), SpinlockRelease(wdm), SpinLockSafe(storport), SpinLockSafe(storport), SpinLockSafe(wdm)

참고 항목

KeAcquireInStackQueuedSpinLock

KeAcquireSpinLockAtDpcLevel

KeInitializeSpinLock

KeReleaseSpinLock