EmonAllocateCounter

NTSTATUS __stdcall EmonAllocateCounter(INT64 a1, INT64 a2, INT64 a3, INT64 *a4){
  int v5; 
  int v7; 
  NTSTATUS HalCounters; 
  __int64 v9; 
  int v10; 
  __int64 v11; 
  int v12; 
  int v13; 
  unsigned __int64 v14; 
  __int64 v15; 
  _DWORD *v16; 
  NTSTATUS result; 

  v5 = a3;
  v7 = a1;
  HalCounters = HalpAllocateHalCounters();
  v10 = 0;
  if( HalCounters < 0 )
    return -2147483631;
  v11 = *(&CmpDummyThreadEvent + 620) + 16i64 * *(&CmpDummyThreadEvent + 1217) * KeGetPcr()->Prcb.Number;
  if( !v9 || !*(_BYTE *)(v9 + 220) )
  {
    v13 = *(&CmpDummyThreadEvent + 1223) - 1;
    v15 = *(&CmpDummyThreadEvent + 1223) - 1;
    if( *(&CmpDummyThreadEvent + 1223) - 1 >= 0 )
    {
      v16 = (_DWORD *)(v11 + 16i64 * v13);
      while( *v16 != 3 || (__readmsr(v13 + 390) & 0x4000FF) != 0 )
      {
        --v13;
        v16 -= 4;
        if( --v15 < 0 )
          goto LABEL_13;
      }
      goto LABEL_6;
    }
    goto LABEL_13;
  }
  v12 = *(unsigned __int8 *)(v9 + 212);
  v13 = v12 + *(&CmpDummyThreadEvent + 1223);
  if( *(_DWORD *)(v11 + 16i64 * (unsigned int)(v12 + *(&CmpDummyThreadEvent + 1223))) != 3
    || (v14 = __readmsr(0x38Fu), _bittest64((const __int64 *)&v14, (unsigned __int8)(v12 + 32))) )
  {
LABEL_13:
    _InterlockedExchangeAdd((_DWORD *)&stru_140CF2E80 + 1614, 0xFFFFFFFE);
    return -2147483631;
  }
LABEL_6:
  *(_DWORD *)(v11 + 16i64 * v13) = v7;
  if( v7 == 2 )
  {
    *(_QWORD *)(v11 + 16i64 * v13 + 4) = 24i64;
  }
  else
  {
    *(_DWORD *)(v11 + 16i64 * v13 + 4) = v5;
    *(_DWORD *)(v11 + 16i64 * v13 + 8) = *(_DWORD *)(a2 + 24);
    v10 = *(_DWORD *)(a2 + 208);
  }
  *(_DWORD *)(v11 + 16i64 * v13 + 12) = v10;
  result = 0;
  *(_DWORD *)a4 = v13;
  return result;
}

Referenced by:

EmonEnableMonitoring