EmonMarkCountersReserved

INT64 __fastcall EmonMarkCountersReserved(INT64 a1, UINT64 a2){
  unsigned int v2; 
  unsigned __int64 v4; 
  unsigned int v5; 
  __int64 v6; 
  unsigned __int8 CurrentIrql; 
  bool i; 
  __int64 v9; 
  unsigned int v10; 
  char v11; 
  unsigned __int64 v12; 
  char v13; 
  __int64 v14; 
  struct _GROUP_AFFINITY Affinity; 
  struct _GROUP_AFFINITY PreviousAffinity; 
  v2 = 0;
  v4 = a2;
  Affinity = 0i64;
  v5 = KiProcessorIndexToNumberMappingTable[(unsigned int)a1];
  Affinity.Group = v5 >> 6;
  v6 = EmonCounterStatus + 16i64 * (unsigned int)(a1 * EmonNumberCounters);
  Affinity.Mask = 1i64 << (v5 & 0x3F);
  PreviousAffinity = 0i64;
  KeSetSystemGroupAffinityThread(&Affinity, &PreviousAffinity);
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(0xFui64);
  for( i = !_BitScanForward64((unsigned __int64 *)&v9, a2); !i; i = !_BitScanForward64((unsigned __int64 *)&v9, v4) )
  {
    v10 = EmonNumberArchCounters;
    v11 = v9;
    if( (unsigned int)v9 >= EmonNumberArchCounters )
      LODWORD(v9) = v9 + EmonNumberArchCounters - 32;
    if( *(_DWORD *)(v6 + 16i64 * (unsigned int)v9) != 3 )
    {
      v12 = v4 ^ a2;
      v2 = -1073741670;
      if( v12 )
      {
        while( 1 )
        {
          i = !_BitScanForward64((unsigned __int64 *)&v14, v12);
          if( i )
            break;
          v13 = v14;
          if( (unsigned int)v14 >= v10 )
            v14 = (unsigned int)v14 + v10 - 32;
          v12 ^= 1i64 << v13;
          *(_DWORD *)(v6 + 16 * v14) = 3;
        }
      }
      break;
    }
    v4 ^= 1i64 << v11;
    *(_DWORD *)(v6 + 16i64 * (unsigned int)v9) = 2;
  }
  __writecr8(CurrentIrql);
  KeRevertToUserGroupAffinityThread(&PreviousAffinity);
  return v2;
}

Referenced by:

EmonAllocateResources