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) |