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