ExCompareExchangeCallBack
CHAR __fastcall ExCompareExchangeCallBack(INT64 *a1, struct EX_RUNDOWN_REF *a2, INT64 a3){
signed __int64 i;
signed __int64 *v7;
signed __int64 Count;
signed __int64 v9;
signed __int64 v11;
unsigned __int64 v12;
unsigned int v13;
signed __int64 v14;
bool v15;
signed __int64 v16;
unsigned __int64 v17;
unsigned __int64 v18;
if( a2 && !ExAcquireRundownProtectionEx(a2, 0x10ui64) )
return 0;
_m_prefetchw(a1);
for( i = *a1; (a3 ^ (unsigned __int64)i) <= 0xF; i = v11 )
{
v11 = _InterlockedCompareExchange64(a1, ((unsigned __int64)a2 | 0xF) & -(__int64)(a2 != 0i64), i);
if( i == v11 )
break;
}
v7 = (signed __int64 *)(i & 0xFFFFFFFFFFFFFFF0ui64);
if( (i & 0xFFFFFFFFFFFFFFF0ui64) != a3 )
{
if( a2 )
{
_m_prefetchw(a2);
Count = a2->Count;
while( (Count & 1) == 0 )
{
v9 = Count;
Count = _InterlockedCompareExchange64((volatile signed __int64 *)a2, Count - 32, Count);
if( v9 == Count )
return 0;
}
v18 = Count & 0xFFFFFFFFFFFFFFFEui64;
if( _InterlockedExchangeAdd64((volatile signed __int64 *)v18, 0xFFFFFFFFFFFFFFF0ui64) == 16
&& !_interlockedbittestandreset((volatile signed __int32 *)(v18 + 32), 0) )
{
KeSetEvent((PRKEVENT)(v18 + 8), 0);
}
}
return 0;
}
if( v7 )
{
v12 = ExAcquireSpinLockExclusive(&ExpCallBackFlush);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&ExpCallBackFlush);
__writecr8(v12);
v13 = (i & 0xF) + 1;
_m_prefetchw(v7);
v14 = *v7;
if( (*v7 & 1) != 0 )
{
LABEL_18:
v17 = v14 & 0xFFFFFFFFFFFFFFFEui64;
if( _InterlockedExchangeAdd64((volatile signed __int64 *)v17, -(__int64)v13) == v13
&& !_interlockedbittestandreset((volatile signed __int32 *)(v17 + 32), 0) )
{
KeSetEvent((PRKEVENT)(v17 + 8), 0);
}
}
else
{
while( 1 )
{
v16 = _InterlockedCompareExchange64(v7, v14 - 2 * v13, v14);
v15 = v14 == v16;
v14 = v16;
if( v15 )
break;
if( (v16 & 1) != 0 )
goto LABEL_18;
}
}
}
return 1;
}Referenced by:
DbgkLkmdRegisterCallback
DbgkLkmdUnregisterCallback
IoRegisterPriorityCallback
IoUnregisterPriorityCallback
KeDeregisterBoundCallback
KeRegisterBoundCallback
PoRegisterCoalescingCallback
PoUnregisterCoalescingCallback
PsEstablishWin32Callouts
PsRemoveCreateThreadNotifyRoutine
PsRemoveLoadImageNotifyRoutine
PsSetLoadImageNotifyRoutineEx
PspSetCreateProcessNotifyRoutine
PspSetCreateThreadNotifyRoutine