ExWaitForRundownProtectionReleaseCacheAware

VOID __stdcall ExWaitForRundownProtectionReleaseCacheAware(_EX_RUNDOWN_REF_CACHE_AWARE *RunRefCacheAware){
  unsigned __int64 v1; 
  unsigned int Number; 
  unsigned int v3; 
  int v4; 
  __int64 v5; 
  signed __int64 v6; 
  __int128 Object; 
  __int128 v8; 

  v6 = 0i64;
  v1 = 0i64;
  Number = RunRefCacheAware->Number;
  v3 = 0;
  Object = 0i64;
  v8 = 0i64;
  if( Number )
  {
    do
    {
      v4 = v3 % Number;
      ++v3;
      v5 = _InterlockedExchange64(
             (volatile __int64 *)((char *)RunRefCacheAware->RunRefs + RunRefCacheAware->RunRefSize * v4),
             (__int64)&v6 + 1);
      Number = RunRefCacheAware->Number;
      v1 += v5;
    }
    while( v3 < Number );
    if( v1 )
    {
      DWORD1(Object) = 0;
      *(_QWORD *)&v8 = (char *)&Object + 8;
      *((_QWORD *)&Object + 1) = (char *)&Object + 8;
      LOWORD(Object) = 1;
      BYTE2(Object) = 6;
      if( _InterlockedExchangeAdd64(&v6, v1 >> 1) != -(__int64)(v1 >> 1) )
        KeWaitForSingleObject((UINT64)&Object, 0, 0, 0, 0i64);
    }
  }
}

Referenced by:

EtwpFreeLoggerContext
MiDrainCrossPartitionUsage
RawUserFsCtrl
RawVerifyVolume