The FltInitializePushLock routine initializes a push lock variable.
VOID FLTAPI FltInitializePushLock( PEX_PUSH_LOCK PushLock );
Pointer to the caller-supplied storage, which must be at least the value of sizeof(EX_PUSH_LOCK), for the push lock variable to be initialized. The storage must be 4-byte aligned on 32-bit platforms, and 8-byte aligned on 64-bit platforms.
Push locks are similar to ERESOURCE structures (also called "resources") in the following ways:
Push locks can be used for synchronization by a set of threads.
Push locks can be acquired for shared or exclusive access.
Although the caller provides the storage for the push lock variable, the EX_PUSH_LOCK structure is opaque: that is, its members are reserved for system use.
When push locks are mostly acquired for shared access, they are more efficient than ERESOURCE structures.
The storage for push locks can be allocated from paged or nonpaged pool. ERESOURCE structures must be allocated only from nonpaged pool.
EX_PUSH_LOCK structures are much smaller than ERESOURCE structures.
The algorithm for granting exclusive access is not fair to all threads. If there is a high level of exclusive-lock contention, there is no guarantee about the order in which threads will be granted exclusive access.
There are no support routines for determining the current owner of a push lock. (Users of ERESOURCE structures can call routines such as ExIsResourceAcquiredExclusiveLite to determine whether the current thread has exclusive access to the resource.)
Push locks cannot be acquired recursively.
To acquire a push lock for shared access, call FltAcquirePushLockShared.
To release a push lock, call FltReleasePushLock.
To delete a push lock, call FltDeletePushLock.
|Minimum supported client||This routine is available on Microsoft Windows XP SP2, Microsoft Windows Server 2003 SP1, and later.|
|Header||fltkernel.h (include Fltkernel.h)|