EmonAllocateResources

NTSTATUS __stdcall EmonAllocateResources(_XSTATE_CONFIGURATION *a1, INT64 a2, PFN_CLIPSP_CLEAR *a3, INT64 a4, INT64 a5){
  __int32 v9; 
  int v10; 
  int v11; 
  UINT64 v12; 
  _HALP_ALLOC_CONTEXT *v13; 
  UINT8 *v14; 
  UINT8 *v15; 
  int v16; 
  __int64 v17; 
  __int64 v18; 
  __int64 v19; 
  unsigned __int64 v20; 
  unsigned __int64 v21; 
  unsigned __int64 v22; 
  UINT8 **v23; 
  _HALP_ALLOC_CONTEXT *v24; 
  _KAFFINITY_ENUMERATION_CONTEXT Context; 
  UINT64 ProcIndex; 

  *(_DWORD *)(&Context.CurrentIndex + 1) = 0;
  *(&Context.CurrentIndex + 3) = 0;
  LODWORD(ProcIndex) = 0;
  v9 = 1;
  v10 = 0;
  *(_QWORD *)a5 = -1i64;
  if( a4 )
  {
    v9 = _InterlockedExchange((_DWORD *)&CmpDummyThreadEvent + 1238, 1);
    if( v9 )
    {
      v10 = -1073741670;
LABEL_27:
      if( a4 && !v9 )
      {
        *(&CmpDummyThreadEvent + 1237) = 0;
        *(&CmpDummyThreadEvent + 1238) = 0;
      }
      return v10;
    }
    v11 = *(&CmpDummyThreadEvent + 1245);
    if( *(_DWORD *)(a4 + 8) )
      v11 = *(_DWORD *)(a4 + 8);
    *(&CmpDummyThreadEvent + 1237) = v11;
  }
  v12 = 8 * (unsigned int)HalpQueryMaximumRegisteredProcessorCount() + 40;
  v14 = HalpMmAllocCtxAlloc(v13, v12);
  v15 = v14;
  if( !v14 )
  {
    v10 = -1073741801;
    goto LABEL_27;
  }
  memset(v14, 0i64, v12);
  *((_QWORD *)v15 + 2) = a2;
  if( a4 )
    *((_QWORD *)v15 + 3) = *(_QWORD *)a4;
  Context.CurrentMask = (unsigned __int64)a3[1];
  Context.CurrentIndex = 0;
  Context.Affinity = (_KAFFINITY_EX *)a3;
  while( 1 )
  {
    KeEnumerateNextProcessor(&ProcIndex, &Context);
    if( v16 )
      break;
    v10 = EmonMarkCountersReserved((unsigned int)ProcIndex, (UINT64)a1);
    if( v10 < 0 )
      goto LABEL_26;
    v17 = (unsigned int)ProcIndex;
    *(_QWORD *)&v15[8 * (unsigned int)ProcIndex + 32] = a1;
    if( a4 )
    {
      v18 = *(&CmpDummyThreadEvent + 614) + 160 * v17;
      if( *(&CmpDummyThreadEvent + 4920) )
      {
        v19 = *(_QWORD *)(v18 + 32);
        v20 = *(_QWORD *)(v18 + 48);
      }
      else
      {
        v19 = *(unsigned int *)(v18 + 16);
        v20 = *(unsigned int *)(v18 + 24);
      }
      v21 = v19 + (unsigned int)(*(&CmpDummyThreadEvent + 1237) * *(_DWORD *)(a4 + 12));
      if( v21 >= v20 )
      {
        v10 = -1073741811;
LABEL_26:
        EmonReleaseProfileResourcesInternal((INT64)v15);
        HalpMmAllocCtxFree(v24, v15);
        goto LABEL_27;
      }
      if( !*(&CmpDummyThreadEvent + 4920) )
        v21 = (unsigned int)v21;
      *(_QWORD *)(v18 + 56) = v21;
      v10 = 0;
    }
  }
  v22 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)&CmpDummyThreadEvent + 609);
  v23 = (UINT8 **)*(&CmpDummyThreadEvent + 617);
  if( (_UNKNOWN *)**(&CmpDummyThreadEvent + 617) != (_UNKNOWN *)((char *)&CmpDummyThreadEvent + 4928) )
    __fastfail(3u);
  *(_QWORD *)v15 = (char *)&CmpDummyThreadEvent + 4928;
  *((_QWORD *)v15 + 1) = v23;
  *v23 = v15;
  *(&CmpDummyThreadEvent + 617) = v15;
  KxReleaseSpinLock((UINT64 *)&CmpDummyThreadEvent + 609);
  __writecr8(v22);
  *(_QWORD *)a5 = v15;
  return v10;
}

Referenced by:

EmonReserveProfileResources