Amd64AllocateCounter

INT64 __fastcall Amd64AllocateCounter(INT64 a1, _DWORD *a2, _DWORD *a3){
  int v5; 
  int HalCounters; 
  int v7; 
  int v8; 
  __int64 v9; 
  unsigned __int64 v10; 
  _DWORD *i; 
  INT64 result; 
  v5 = a1;
  HalCounters = HalpAllocateHalCounters();
  v7 = 0;
  if( HalCounters < 0 )
    return 2147483665i64;
  v8 = 0;
  v9 = 0i64;
  v10 = Amd64CounterStatus + ((unsigned __int64)*((unsigned int *)KeGetPcr() + 105) << 6);
  for( i = (_DWORD *)v10; *i != 3 || (__readmsr(v8 - 1073676288) & 0x4000FF) != 0; i += 4 )
  {
    ++v8;
    if( ++v9 >= 4 )
    {
      _InterlockedExchangeAdd(&HalpPmuInUse, 0xFFFFFFFE);
      return 2147483665i64;
    }
  }
  *(_DWORD *)(v10 + 16i64 * v8) = v5;
  if( v5 == 2 )
  {
    *(_QWORD *)(v10 + 16i64 * v8 + 4) = 24i64;
  }
  else
  {
    *(_DWORD *)(v10 + 16i64 * v8 + 4) = *a2;
    *(_DWORD *)(v10 + 16i64 * v8 + 8) = a2[6];
    v7 = a2[52];
  }
  *(_DWORD *)(v10 + 16i64 * v8 + 12) = v7;
  result = 0i64;
  *a3 = v8;
  return result;
}

Referenced by:

Amd64EnableMonitoring