PsUpdateComponentPower

void __fastcall PsUpdateComponentPower(PEPROCESS a1, INT64 a2, unsigned __int64 a3){
  struct _PO_PROCESS_ENERGY_CONTEXT *EnergyContext; 
  __int64 v4; 
  __int64 v5; 
  volatile signed __int64 *v6; 
  signed __int64 v7; 
  unsigned int v8; 
  bool v9; 
  signed __int64 v10; 
  signed __int64 v11; 

  if( !a1 || a1 == *(PEPROCESS *)&PsIdleProcess )
    a1 = PsInitialSystemProcess;
  EnergyContext = a1->EnergyContext;
  if( !EnergyContext )
    return;
  if( (_DWORD)a2 == 1 )
  {
    if( !a3 )
      return;
    v4 = 280i64;
    v5 = 64i64;
    goto LABEL_7;
  }
  if( (_DWORD)a2 == 2 )
  {
    if( !a3 )
      return;
    _InterlockedExchangeAdd64((volatile signed __int64 *)EnergyContext + 9, HIDWORD(a3));
    a3 = (unsigned int)a3;
    v4 = 288i64;
    v5 = 88i64;
    goto LABEL_7;
  }
  if( (_DWORD)a2 != 3 )
  {
    PoEnergyContextUpdateComponentPower(a1, a2, a3);
    return;
  }
  if( a3 )
  {
    _InterlockedExchangeAdd64((volatile signed __int64 *)EnergyContext + 10, HIDWORD(a3));
    a3 = (unsigned int)a3;
    v4 = 296i64;
    v5 = 96i64;
LABEL_7:
    v6 = (volatile signed __int64 *)((char *)EnergyContext + v4);
    _InterlockedExchangeAdd64((volatile signed __int64 *)((char *)EnergyContext + v5), a3);
    if( (struct _PO_PROCESS_ENERGY_CONTEXT *)((char *)EnergyContext + v4) )
    {
      v7 = *v6;
      v8 = KiTimelineBitmapTime;
      v9 = KiTimelineBitmapTime <= (unsigned int)*v6;
      if( KiTimelineBitmapTime != (unsigned int)*v6 )
        goto LABEL_18;
      if( (v7 & 0x100000000i64) == 0 )
      {
        do
        {
          v9 = v8 <= (unsigned int)v7;
LABEL_18:
          if( v9 )
          {
            if( (unsigned int)v7 - v8 >= 0x20 )
              return;
            HIDWORD(v11) = HIDWORD(v7) | (1 << (v7 - v8));
            if( HIDWORD(v11) == HIDWORD(v7) )
              return;
            LODWORD(v11) = v7;
          }
          else
          {
            if( v8 - (unsigned int)v7 >= 0x20 )
              HIDWORD(v11) = 1;
            else
              HIDWORD(v11) = (HIDWORD(v7) << (v8 - v7)) | 1;
            LODWORD(v11) = v8;
          }
          v10 = v7;
          v7 = _InterlockedCompareExchange64(v6, v11, v7);
        }
        while( v10 != v7 );
      }
    }
  }
}

Referenced by:

PspApplyJobChainLimitsToProcess