28 IN uint64_t CurrentValue
33 WaitBlock->WakeEvent.signaled =
false;
34 WaitBlock->WakeEvent.lock.locked = 0;
39 WaitBlock->Signaled =
false;
40 WaitBlock->ShareCount = 0;
45 WaitBlock->ShareCount = (uint32_t)(CurrentValue >> 4);
56 WaitBlock->Next = NULL;
66 if (Result == CurrentValue) {
72 CurrentValue = Result;
91 if (!WaitBlock)
return;
95 MspSuspendPushLock(Lock, WaitBlock, Lock->Value);
103 uint64_t Value, NewValue;
128 NewValue = (uint64_t)Next;
154 uint64_t Value, NewValue;
163 if (!WaitBlock)
return;
165 MspSuspendPushLock(Lock, WaitBlock, Value);
183 uint64_t Value, NewValue;
197 while (Last->
Next != NULL) {
FORCEINLINE uint64_t InterlockedAndU64(volatile uint64_t *target, uint64_t value)
FORCEINLINE uint64_t InterlockedCompareExchangeU64(volatile uint64_t *target, uint64_t value, uint64_t comparand)
FORCEINLINE uint32_t InterlockedDecrementU32(volatile uint32_t *target)
struct _DOUBLY_LINKED_LIST * PDOUBLY_LINKED_LIST
MTSTATUS MsWaitForEvent(IN PEVENT event)
MTSTATUS MsSetEvent(IN PEVENT event)
struct _PUSH_LOCK PUSH_LOCK
FORCEINLINE void InitializeListHead(PDOUBLY_LINKED_LIST Head)
struct _PUSH_LOCK_WAIT_BLOCK PUSH_LOCK_WAIT_BLOCK
#define PL_FLAGS_EXCLUSIVE
void MmFreePool(IN void *buf)
void * MmAllocatePoolWithTag(IN enum _POOL_TYPE PoolType, IN size_t NumberOfBytes, IN uint32_t Tag)
void MsAcquirePushLockExclusive(IN PUSH_LOCK *Lock)
void MsAcquirePushLockShared(IN PUSH_LOCK *Lock)
void MsReleasePushLockExclusive(IN PUSH_LOCK *Lock)
void MsReleasePushLockShared(IN PUSH_LOCK *Lock)
struct _PUSH_LOCK_WAIT_BLOCK * Next