PpmRegisterPerfCap

__int64 __fastcall PpmRegisterPerfCap(int *a1){
  unsigned int v2; 
  unsigned int v3; 
  _KPRCB *Prcb; 
  _PROC_PERF_CONSTRAINT *Constraint; 
  INT64 Domain; 
  unsigned int v7; 
  unsigned int v8; 
  unsigned int PlatformCap; 
  _KPRCB *CheckContext; 
  INT64 v12; 
  unsigned int v13; 
  unsigned int v14; 
  __int64 v15; 
  __int64 v16; 
  _KPRCB *v17; 

  PpmAcquireLock((_PPM_LOCK *)((char *)&stru_140C23628 + 1048));
  v2 = 0;
  if( !a1[5] )
  {
    v3 = a1[1];
    if( v3 != -1 )
    {
      Prcb = KeGetPrcb(v3);
      Constraint = Prcb->PowerState.CheckContext.Constraint;
      Domain = (INT64)Prcb->PowerState.CheckContext.Domain;
      goto LABEL_4;
    }
LABEL_33:
    PpmReleaseLock((INT64 *)&stru_140C23628 + 131);
    return(unsigned int)-1073741811;
  }
  v12 = PpmPerfDomainHead;
  v3 = -1;
  Constraint = 0i64;
  if( (INT64 *)PpmPerfDomainHead == &PpmPerfDomainHead )
    goto LABEL_33;
  do
  {
    v13 = *(_DWORD *)(v12 + 200);
    Domain = v12;
    v14 = 0;
    if( v13 )
    {
      v15 = *(_QWORD *)(v12 + 216);
      while( 1 )
      {
        v16 = v15 + 136i64 * v14;
        if( *(_DWORD *)(v16 + 16) )
        {
          if( *(_DWORD *)(v16 + 20) == a1[1] )
            break;
        }
        if( ++v14 >= v13 )
          goto LABEL_25;
      }
      Constraint = (_PROC_PERF_CONSTRAINT *)(v15 + 136i64 * v14);
      if( v16 )
        break;
    }
LABEL_25:
    v12 = *(_QWORD *)v12;
  }
  while( (INT64 *)v12 != &PpmPerfDomainHead );
LABEL_4:
  if( !Domain || !Constraint )
    goto LABEL_33;
  v7 = a1[2];
  v8 = a1[3];
  Constraint->LimitReasons = a1[4];
  PlatformCap = Constraint->PlatformCap;
  if( PlatformCap != v7 )
  {
    if( PlatformCap == 100 )
    {
      Constraint->PlatformCapStartTime = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
    }
    else if( v7 == 100 )
    {
      PopDiagTraceProcessorThrottleDurationPerfTrack(
        (*(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart - Constraint->PlatformCapStartTime) / 0x2710,
        v3);
      Constraint->PlatformCapStartTime = 0i64;
    }
    CheckContext = (_KPRCB *)Constraint->CheckContext;
    Constraint->PlatformCap = v7;
    if( CheckContext )
    {
      PpmEventBiosCapChange(CheckContext, v7);
    }
    else if( !*(_DWORD *)(Domain + 208) )
    {
      PpmEventHiddenProcessorBiosCapChange(*(_QWORD *)(Domain + 16) - 33128i64, (unsigned int)a1[1], (NPTEXTMETRIC *)v7);
    }
    PopDiagTraceProcessorThrottlePerfTrack(100 - v7, v3);
  }
  if( Constraint->ThermalCap != v8 )
  {
    v17 = (_KPRCB *)Constraint->CheckContext;
    Constraint->ThermalCap = v8;
    if( v17 )
    {
      PpmEventThermalCapChange(v17, v8);
    }
    else if( !*(_DWORD *)(Domain + 208) )
    {
      PpmEventHiddenProcessorThermalCapChange(*(_QWORD *)(Domain + 16) - 33128i64, a1[1], v8);
    }
  }
  *(_BYTE *)(Domain + 765) = 1;
  PpmCheckApplyPerfConstraints(0);
  return v2;
}

Referenced by:

No references.