Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Wywołanie KeAcquireSpinLock lub KeAcquireInStackQueuedSpinLock ustawia IRQL na bieżącym procesorze na DISPATCH_LEVEL do momentu, gdy wywołanie KeReleaseSpinLock lub KeReleaseInStackQueuedSpinLock przywróci poprzedni poziom IRQL. Dlatego sterowniki muszą działać na poziomie IRQL <= DISPATCH_LEVEL podczas wywoływania KeAcquireSpinLock lub KeAcquireInStackQueuedSpinLock.
Wywoływacze KeAcquireSpinLockAtDpcLevel, KeAcquireInStackQueuedSpinLockAtDpcLevel, KeReleaseInStackQueuedSpinLockFromDpcLevel i KeReleaseSpinLockFromDpcLevel działają szybciej, ponieważ już działają na poziomie IRQL = DISPATCH_LEVEL, więc te funkcje pomocnicze nie muszą resetować IRQL na bieżącym procesorze. Zatem jest to błąd krytyczny na większości platform systemu Windows, wywołanie KeAcquireSpinLockAtDpcLevel lub KeAcquireInStackQueuedSpinLockAtDpcLevel podczas działania na poziomie IRQL niższym niż DISPATCH_LEVEL. Jest to również błąd zwolnienia blokady spinlock, która została nabyta za pomocą KeAcquireSpinLock, wywołując KeReleaseSpinLockFromDpcLevel, ponieważ oryginalny poziom IRQL obiektu wywołującego nie zostanie przywrócony.
Procedury, które posiadają blokadę spin ekzekutywną, takie jak ExInterlockedXxx, są zwykle wykonywane na poziomie IRQL = DISPATCH_LEVEL, dopóki nie zwolnią blokady spin i nie zwrócą kontroli do wywołującego. Jest jednak możliwe, aby procedura przerwania sterownika oraz procedury SynchCritSection (które działają na DIRQL), wywoływały niektóre procedury ExInterlockedXxx, takie jak procedury ExInterlockedXxxList, pod warunkiem że blokada spin przekazana do procedury jest używana wyłącznie przez ISR i procedury SynchCritSection.
Każda rutyna, która zawiera blokadę spin przerwania jest wykonywana w DIRQL skojarzonego zestawu obiektów przerwania. W związku z tym sterownik nie może wywoływać KeAcquireSpinLock i KeReleaseSpinLock ani żadnej innej procedury wykorzystującej blokadę spin executive z jego rutyn ISR lub SynchCritSection. Takie wywołanie jest błędem, który może spowodować zakleszczenie systemu, co wymaga ponownego uruchomienia maszyny przez użytkownika. Należy pamiętać, że jeśli procedura ISR sterownika lub rutyna SynchCritSection wywołuje funkcję ExInterlockedXxxList, sterownik nie może ponownie użyć blokady spinlock, którą przekazuje do funkcji ExInterlockedXxxList w wywołaniach do funkcji wsparcia KeXxxSpinLock lub KeXxxSpinLockXxxDpcLevel.
Jeśli sterownik ma wielowektorowy ISR lub więcej niż jeden ISR, jego procedury mogą wywoływać KeSynchronizeExecution podczas wykonywania na dowolnym IRQL aż do wartości SynchronizeIrql określonej dla skojarzonych obiektów przerwań, gdy zostały połączone.