RtlpFcAddDelayedUsageReportToBuffer

__int64 __fastcall RtlpFcAddDelayedUsageReportToBuffer(unsigned __int32 *a1, _QWORD *a2){
  unsigned int v2; 
  unsigned __int32 v5; 
  int v6; 
  char *v7; 
  unsigned __int32 v8; 
  unsigned int i; 
  unsigned int v10; 
  unsigned int v11; 
  __int64 *v12; 
  __int64 j; 
  unsigned __int64 v14; 
  unsigned int SizeOfBitMap; 
  __int64 v16; 
  _RTL_BITMAP BitMapHeader; 
  unsigned int v19; 

  v2 = 0;
  *(_QWORD *)&BitMapHeader.SizeOfBitMap = 64i64;
  v19 = 0;
  BitMapHeader.Buffer = a1 + 2;
  while( 1 )
  {
    _m_prefetchw(a1);
    v5 = *a1;
    if( *a1 == 64 )
    {
      v2 = -1073741670;
      _InterlockedIncrement((volatile signed __int32 *)a1 + 1);
      return v2;
    }
    if( v5 == _InterlockedCompareExchange((volatile signed __int32 *)a1, v5 + 1, v5) )
      break;
    RtlBackoff(&v19);
  }
  v6 = ((__int64)BitMapHeader.Buffer & 4) != 0i64 ? 0x20 : 0;
  v7 = (char *)BitMapHeader.Buffer - (((__int64)BitMapHeader.Buffer & 4) != 0i64 ? 4 : 0);
  do
  {
    v8 = v5 < BitMapHeader.SizeOfBitMap ? v5 : 0;
    for( i = BitMapHeader.SizeOfBitMap - 1; ; i = SizeOfBitMap - 1 )
    {
      v10 = v6 + i;
      if( i - v8 == -1 )
        goto LABEL_8;
      v12 = (__int64 *)&v7[8 * ((unsigned __int64)(v6 + v8) >> 6)];
      for( j = *v12 | ((1i64 << ((v6 + v8) & 0x3F)) - 1); j == -1; j = *v12 )
      {
        if( ++v12 > (__int64 *)&v7[8 * ((unsigned __int64)v10 >> 6)] )
          goto LABEL_8;
      }
      _BitScanForward64(&v14, ~j);
      v11 = v14 + ((unsigned int)(((char *)v12 - v7) >> 3) << 6);
      if( v11 > v10 )
      {
LABEL_8:
        v11 = -1;
      }
      else if( v11 != -1 )
      {
        break;
      }
      if( !v8 )
        break;
      SizeOfBitMap = v5 + 1;
      v8 = 0;
      if( v5 + 1 > BitMapHeader.SizeOfBitMap )
        SizeOfBitMap = BitMapHeader.SizeOfBitMap;
    }
    v16 = v11 - v6;
    if( v11 == -1 )
      v16 = 0xFFFFFFFFi64;
  }
  while( !RtlInterlockedSetClearRun((INT64)&BitMapHeader, (unsigned int)v16, 1ui64) );
  *(_QWORD *)&a1[3 * v16 + 5] = *a2;
  return v2;
}

Referenced by:

CmFcManagerNotifyFeatureUsage