ExCompareExchangeCallBack

UINT8 __stdcall ExCompareExchangeCallBack(
        _EX_CALLBACK *CallBack,
        _EX_RUNDOWN_REF *NewBlock,
        _EX_CALLBACK_ROUTINE_BLOCK *OldBlock){
  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( NewBlock && !ExAcquireRundownProtectionEx((INT64 *)NewBlock, 16i64) )
    return 0;
  _m_prefetchw(CallBack);
  for( i = *(_QWORD *)CallBack->RoutineBlock; ((unsigned __int64)OldBlock ^ i) <= 0xF; i = v11 )
  {
    v11 = _InterlockedCompareExchange64(
            (volatile signed __int64 *)CallBack,
            ((unsigned __int64)NewBlock | 0xF) & -(__int64)(NewBlock != 0i64),
            i);
    if( i == v11 )
      break;
  }
  v7 = (signed __int64 *)(i & 0xFFFFFFFFFFFFFFF0ui64);
  if( (_EX_CALLBACK_ROUTINE_BLOCK *)(i & 0xFFFFFFFFFFFFFFF0ui64) != OldBlock )
  {
    if( NewBlock )
    {
      _m_prefetchw(NewBlock);
      Count = NewBlock->Count;
      while( (Count & 1) == 0 )
      {
        v9 = Count;
        Count = _InterlockedCompareExchange64((volatile signed __int64 *)NewBlock, 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, 0);
      }
    }
    return 0;
  }
  if( v7 )
  {
    v12 = (unsigned __int8)ExAcquireSpinLockExclusive((INT64 *)&ExBootDevicesRemovedEvent + 7);
    ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&ExBootDevicesRemovedEvent + 7);
    __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, 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
PoRegisterCoalescingCallback
PoUnregisterCoalescingCallback
PsRemoveCreateThreadNotifyRoutine
PsRemoveLoadImageNotifyRoutine
PsSetLoadImageNotifyRoutineEx
PspSetCreateProcessNotifyRoutine