Samtalssupportrutiner som använder spinnlås

Att anropa KeAcquireSpinLock eller KeAcquireInStackQueuedSpinLock anger att IRQL på den aktuella processorn ska DISPATCH_LEVEL tills ett motsvarande anrop till KeReleaseSpinLock eller KeReleaseInStackQueuedSpinLock återställer den tidigare IRQL:en. Därför måste drivrutiner köras på IRQL <= DISPATCH_LEVEL när de anropar KeAcquireSpinLock eller KeAcquireInStackQueuedSpinLock.

De som anropar KeAcquireSpinLockAtDpcLevel, KeAcquireInStackQueuedSpinLockAtDpcLevel, KeReleaseInStackQueuedSpinLockFromDpcLevel och KeReleaseSpinLockFromDpcLevel körs snabbare eftersom de redan körs på IRQL = DISPATCH_LEVEL, vilket innebär att dessa supportrutiner inte behöver återställa IRQL på den aktuella processorn. Det är därför ett allvarligt fel på de flesta Windows-plattformar att anropa KeAcquireSpinLockAtDpcLevel eller KeAcquireInStackQueuedSpinLockAtDpcLevel när de körs på IRQL mindre än DISPATCH_LEVEL. Det är också ett fel att släppa ett spinnlås som hämtades med KeAcquireSpinLock genom att anropa KeReleaseSpinLockFromDpcLevel eftersom anroparens ursprungliga IRQL inte återställs.

Rutiner som har ett executive spin lock, till exempel ExInterlockedXxx, körs vanligtvis på IRQL = DISPATCH_LEVEL tills de släpper spinnlåset och returnerar kontrollen till anroparen. Det är dock möjligt för en förares InterruptService-rutin och SynchCritSection-rutiner (som körs på DIRQL) att anropa vissa ExInterlockedXxx-rutiner , till exempel rutinerna ExInterlockedXxxList , så länge spinnlåset som skickas till rutinen endast används av ISR- och SynchCritSection-rutinerna .

Varje rutin som innehåller ett avbrottsspinnlås körs vid DIRQL för en associerad uppsättning avbrottsobjekt. Därför får en drivrutin inte anropa KeAcquireSpinLock och KeReleaseSpinLock eller någon annan rutin som använder ett executive spin lock från sina ISR- eller SynchCritSection-rutiner . Ett sådant anrop är ett fel som kan orsaka ett systemstopp, vilket kräver att användaren startar om sin dator. Observera att om en förares ISR- eller SynchCritSection-rutin anropar en ExInterlockedXxxList-rutin kan föraren inte återanvända det spinnlås som den skickar till rutinerna ExInterlockedXxxList i anrop till KeXxxSpinLock eller KeXxxSpinLockXxxDpcLevel supportrutiner.

Om en drivrutin har en ISR för flera vektorer eller mer än en ISR kan dess rutiner anropa KeSynchronizeExecution vid körning vid valfri IRQL upp till det SyncIrql-värde som angetts för de associerade avbrottsobjekten när de var anslutna.