ExfAcquirePushLockExclusiveEx
VOID __stdcall ExfAcquirePushLockExclusiveEx(_EX_PUSH_LOCK *PushLock, VOID *LockHandle, VOID *LockPointer){
unsigned __int64 bf_0;
__int64 v7;
bool v8;
__int64 v9;
signed __int64 v10;
bool v11;
signed __int64 v12;
int i;
unsigned __int64 v14;
unsigned __int64 v15;
unsigned __int64 v16;
unsigned __int64 v17;
__int64 Object[8];
unsigned int v19;
memset(Object, 0i64, sizeof(Object));
v19 = 0;
_m_prefetchw(PushLock);
bf_0 = PushLock->_bf_0;
v7 = (unsigned int)(unsigned __int8)v19 + 3;
while( (bf_0 & 1) != 0 )
{
if( LockHandle )
KeAbPreWait(LockHandle);
v8 = 0;
Object[7] = (__int64)LockHandle;
HIDWORD(Object[6]) = v7;
Object[5] = 0i64;
if( (bf_0 & 2) != 0 )
{
Object[4] = 0i64;
LODWORD(Object[6]) = -1;
Object[3] = bf_0 & 0xFFFFFFFFFFFFFFF0ui64;
v10 = (unsigned __int64)Object | bf_0 & 8 | 7;
v8 = (bf_0 & 4) == 0;
}
else
{
v9 = 11i64;
Object[4] = (__int64)Object;
LODWORD(Object[6]) = bf_0 >> 4;
if( SLODWORD(Object[6]) <= 1 )
v9 = v7;
v10 = (unsigned __int64)Object | v9;
if( !(unsigned int)(bf_0 >> 4) )
LODWORD(Object[6]) = -2;
}
v12 = _InterlockedCompareExchange64(&PushLock->_bf_0, v10, bf_0);
v11 = bf_0 == v12;
bf_0 = v12;
if( !v11 )
goto LABEL_13;
if( v8 )
ExpOptimizePushLockList(PushLock, (_EX_PUSH_LOCK)v10);
Object[2] = (__int64)&Object[1];
Object[1] = (__int64)&Object[1];
LOWORD(Object[0]) = 1;
BYTE2(Object[0]) = 6;
HIDWORD(Object[0]) = 0;
if( KUSER_SHARED_DATA.UnparkedProcessorCount > 1u )
{
if( KUSER_SHARED_DATA.ProcessorFeatures[35] )
{
v14 = __rdtsc();
v15 = v14 + (unsigned int)ExpSpinCycleCount;
while( 1 )
{
__asm { monitorx rax, rcx, rdx }
if( (Object[6] & 0x200000000i64) == 0 )
break;
v16 = v14;
v17 = __rdtsc();
v14 = v17;
if( v17 <= v16 || v17 >= v15 )
break;
__asm { mwaitx rax, rcx, rbx }
}
}
else
{
for( i = 0;
(Object[6] & 0x200000000i64) != 0
&& i != ExpSpinCycleCount / (unsigned int)KUSER_SHARED_DATA.CyclesPerYield;
++i )
{
_mm_pause();
}
}
}
if( _interlockedbittestandreset((volatile signed __int32 *)&Object[6] + 1, 1u) )
KeWaitForSingleObject((UINT64)Object, 28, 0, 0, 0i64);
LABEL_14:
if( LockHandle )
LockHandle = KeAbPreAcquire(LockPointer, LockHandle, 0i64);
}
if( bf_0 != _InterlockedCompareExchange64(&PushLock->_bf_0, bf_0 + 1, bf_0) )
{
if( LockHandle )
KeAbPreWait(LockHandle);
LABEL_13:
RtlBackoff(&v19);
bf_0 = PushLock->_bf_0;
_m_prefetchw(PushLock);
goto LABEL_14;
}
}Referenced by:
ExAcquirePushLockExclusiveEx
ExGetWakeTimerList
ExRegisterExtension
ExRegisterHost
ExShareAddressSpaceWithDevice
ExSvmBeginDeviceReset
ExSvmFinalizeDeviceReset
ExUnregisterExtension
ExUuidCreate
ExWakeTimersPause
ExfAcquireCacheAwarePushLockExclusiveEx
ExfAcquirePushLockExclusive
ExfAcquireReleasePushLockExclusive
ExpAcquireFannedOutPushLockExclusive
ExpDeleteTimer
ExpKdPullRemoteFileForUser
ExpSaAllocatorAllocate
ExpSaAllocatorFree
ExpSaPageGroupAllocateMemory
ExpSaPageGroupDescriptorAllocate
ExpSaPageGroupDescriptorFree
ExpSaPageGroupFreeMemory
ExpSetTimerObject
ExpSvmDereferenceDevice
ExpWnfAllocateNextPersistentNameSequence
ExpWnfCompleteThreadSubscriptions
ExpWnfCreateNameInstance
ExpWnfCreateProcessContext
ExpWnfDeleteNameInstance
ExpWnfDeleteProcessContext
ExpWnfDeleteScopeById
ExpWnfDeleteScopeInstances
ExpWnfDeleteStateData
ExpWnfDeleteSubscription
ExpWnfDeliverThreadNotifications
ExpWnfDispatchKernelSubscription
ExpWnfResolveScopeInstance
ExpWnfSubscribeNameInstance
ExpWnfUpdateSubscription
ExpWnfWriteStateData
ExpWorkerInitialization
FlushLookUpTableBucket
NtAllocateUuids
NtCancelTimer
NtReleaseKeyedEvent
NtSetUuidSeed
NtWaitForKeyedEvent
PdcAcquireRwLockExclusive
TlgRegisterAggregateProviderEx
WbAddHeapExecutedBlockToCache
WbAddHeapExecutedBlockToLRU
WbAddWarbirdEncryptionSegment
WbAllocateSlots
WbAllocateUserMemory
WbDecryptEncryptionSegment
WbFreeMemoryBlockRegion
WbGetInitializedEncryptionSegment
WbGetWarbirdProcess
WbGetWarbirdThread
WbHeapExecutionUnloadModule
WbInPlaceEncryptionUnloadModule
WbMoveHeapExecutedBlockToBackOfLRU
WbReEncryptEncryptionSegment
WbReleaseLeastRecentlyUsedHeapExecutedBlocks
WbRemoveWarbirdProcess
WheaConfigureErrorSource
WheaInitialize
WheaRegisterInUsePageOfflineNotification
WheaUnconfigureErrorSource
WheaUnregisterInUsePageOfflineNotification
WheapCallInUsePageNotificationCallbacks
WheapPfaReset
WheapPredictiveFailureAnalysis