ExfAcquirePushLockSharedEx
INT64 __fastcall ExfAcquirePushLockSharedEx(UINT64 *a1, VOID *a2, VOID *a3){
unsigned __int64 v6;
__int64 v7;
__int64 v8;
INT64 result;
bool v10;
_BYTE *v11;
bool v12;
signed __int64 v13;
int i;
VOID *v15;
unsigned __int64 v16;
unsigned __int64 v17;
unsigned __int64 v18;
unsigned __int64 v19;
__int16 Object;
char v21;
_BYTE v22[5];
__int64 v23[3];
__int16 *p_Object;
__int64 v25;
int v26;
signed __int32 v27;
VOID *v28;
UINT64 v29;
memset((INT64)&Object, 0i64);
LODWORD(v29) = 0;
_m_prefetchw(a1);
v6 = *a1;
while( 1 )
{
v7 = (v6 >> 1) & 1;
if( (v6 & 1) == 0 || !v7 && (v6 & 0xFFFFFFFFFFFFFFF0ui64) != 0 )
break;
if( a2 )
KeAbPreWait(a2);
v10 = 0;
v28 = a2;
v27 = 2;
v25 = 0i64;
if( v7 )
{
p_Object = 0i64;
v26 = -1;
v23[2] = v6 & 0xFFFFFFFFFFFFFFF0ui64;
v11 = (_BYTE *)((unsigned __int64)&Object | v6 & 8 | 7);
v10 = (v6 & 4) == 0;
}
else
{
v26 = -2;
p_Object = &Object;
v11 = v22;
}
v13 = _InterlockedCompareExchange64((volatile signed __int64 *)a1, (signed __int64)v11, v6);
v12 = v6 == v13;
v6 = v13;
if( !v12 )
goto LABEL_24;
if( v10 )
ExpOptimizePushLockList((volatile INT64 *)a1, (INT64)v11);
v23[1] = (__int64)v23;
v23[0] = (__int64)v23;
Object = 1;
v21 = 6;
*(_DWORD *)&v22[1] = 0;
if( KUSER_SHARED_DATA.UnparkedProcessorCount > 1u )
{
if( KUSER_SHARED_DATA.ProcessorFeatures[35] )
{
v16 = __rdtsc();
v17 = v16 + (unsigned int)ExpSpinCycleCount;
while( 1 )
{
__asm { monitorx rax, rcx, rdx }
if( (v27 & 2) == 0 )
break;
v18 = v16;
v19 = __rdtsc();
v16 = v19;
if( v19 <= v18 || v19 >= v17 )
break;
__asm { mwaitx rax, rcx, rbx }
}
}
else
{
for( i = 0; (v27 & 2) != 0 && i != ExpSpinCycleCount / (unsigned int)KUSER_SHARED_DATA.CyclesPerYield; ++i )
_mm_pause();
}
}
if( _interlockedbittestandreset(&v27, 1u) )
KeWaitForSingleObject(&Object, WrPushLock, 0, 0, 0i64);
LABEL_25:
if( a2 )
{
LODWORD(v15) = KeAbPreAcquire(a3, a2, 0i64);
a2 = v15;
}
}
v8 = (v6 | 1) + 16;
if( v7 )
v8 = v6 | 1;
result = _InterlockedCompareExchange64((volatile signed __int64 *)a1, v8, v6);
if( v6 != result )
{
if( a2 )
KeAbPreWait(a2);
LABEL_24:
RtlBackoff(&v29);
v6 = *a1;
_m_prefetchw(a1);
goto LABEL_25;
}
return result;
}Referenced by:
ExAcquireAutoExpandPushLockShared
ExAcquireCacheAwarePushLockSharedEx
ExAcquirePushLockSharedEx
ExRegisterExtension
ExfAcquirePushLockShared
ExpAcquireFannedOutPushLockShared
ExpKdPullRemoteFileForUser
ExpNtUpdateWnfStateData
ExpSaAllocatorAllocate
ExpSaAllocatorFree
ExpWnfAcquireSubscriptionByName
ExpWnfAcquireSubscriptionNameInstance
ExpWnfCompleteThreadSubscriptions
ExpWnfDeliverThreadNotifications
ExpWnfDispatchKernelSubscription
ExpWnfEnumerateScopeInstances
ExpWnfLookupNameInstance
ExpWnfNotifyNameSubscribers
ExpWnfNotifySubscription
ExpWnfReadStateData
ExpWnfResolveScopeInstance
ExpWnfSubscribeNameInstance
InsertEventEntryInLookUpTable
WbAllocateSlots
WbAllocateUserMemory
WbGetHeapExecutedBlock
WbGetWarbirdEncryptionSegment
WbGetWarbirdProcess
WbGetWarbirdThread
WbRemoveWarbirdProcess
WheaConfigureErrorSource
WheaUnconfigureErrorSource
sub_14065DA88