1.3.3 Spin Locks and Interlocks

IoAcquireCancelSpinLock

Synchronizes cancelable-state transitions for IRPs in a multiprocessor-safe manner.

IoSetCancelRoutine

Sets or clears the Cancel routine in an IRP during a cancelable state transition. Setting a Cancel routine makes an IRP cancelable.

IoReleaseCancelSpinLock

Releases the cancel spin lock when the driver has changed the cancelable state of an IRP or releases the cancel spin lock from the driver's Cancel routine.

KeInitializeSpinLock

Initializes a variable of type KSPIN_LOCK, used to synchronize access to data shared among nonISR routines. An initialized spin lock also is a required parameter to the ExInterlockedXxx routines.

KeAcquireSpinLock

Acquires a spin lock so the caller can synchronize access to shared data in a multiprocessor-safe way.

KeReleaseSpinLock

Releases a spin lock that was acquired by calling KeAcquireSpinLock and restores the original IRQL at which the caller was running.

KeAcquireSpinLockAtDpcLevel

Acquires a spin lock, provided that the caller is already running at IRQL DISPATCH_LEVEL.

KeReleaseSpinLockFromDpcLevel

Releases a spin lock that was acquired by calling KeAcquireSpinLockAtDpcLevel.

ExInterlocked..List

Insert and remove IRPs in a driver-managed internal queue, which is protected by an initialized spin lock for which the driver provides the storage.

ExInterlocked..Zone

Allocates and deallocates fixed-size entries, under spin lock control, from a driver-allocated and initialized zone buffer.

Ke..DeviceQueue

Insert and remove IRPs in a driver-allocated and managed internal device queue object, which is protected by a built-in spin lock.

ExInterlockedAddUlong

Adds a value to a variable of type ULONG as an atomic operation, using a spin lock to ensure multiprocessor-safe access to the variable; returns the original (unsummed) value of the variable.

ExInterlockedAddLargeInteger

Adds a value to a variable of type LARGE_INTEGER as an atomic operation, using a spin lock to ensure multiprocessor-safe access to the variable; returns the original (unsummed) value of the variable.

InterlockedIncrement

Increments a variable of type LONG as an atomic operation. The sign of the return value is the sign of the result of the operation.

InterlockedDecrement

Decrements a variable of type LONG as an atomic operation. The sign of the return value is the sign of the result of the operation.

InterlockedExchange

Sets a variable of type LONG to a specified value as an atomic operation; returns the original (unset) value of the variable.

KeGetCurrentProcessorNumber

Returns the current processor number when debugging spin lock usage in SMP machines.