PoEnergyContextUpdateComponentPower

VOID __stdcall PoEnergyContextUpdateComponentPower(_EPROCESS *Process, INT64 a2, INT64 a3){
  struct _PO_PROCESS_ENERGY_CONTEXT *EnergyContext; 
  int v4; 
  int v5; 
  int v7; 
  int v8; 
  int v9; 
  NTSTATUS v10; 
  int v11; 
  unsigned int v12; 
  unsigned int v13; 
  int v14; 
  unsigned int v15; 
  UINT64 *v16; 
  UINT64 TimelineBitmapTime; 
  unsigned int v18; 
  int v19; 
  int v20; 
  unsigned int v21; 
  int v22; 
  unsigned int v23; 
  unsigned int v24; 
  __int16 v25; 
  UINT64 *v26; 
  UINT64 v27; 
  unsigned int v28; 
  __int16 v29; 
  UINT64 v30; 
  unsigned int v31; 
  bool v32; 
  __int64 v33; 
  bool v34; 
  UINT64 *v35; 
  __int64 v36; 
  unsigned int v37; 
  unsigned int v38; 
  UINT64 v39; 
  _QWORD *v40; 
  unsigned int v41; 
  unsigned int v42; 
  int v43; 
  unsigned int v44; 
  int v45; 
  __int64 v46; 
  __int64 v47; 
  int v49[36]; 

  EnergyContext = Process->EnergyContext;
  v4 = a3;
  v5 = a2;
  memset(v49, 0i64, sizeof(v49));
  if( EnergyContext )
  {
    PopAcquireRwLockExclusive((_POP_RW_LOCK *)EnergyContext + 27);
    if( v5 == 9 )
    {
      v20 = HIDWORD(*((_QWORD *)EnergyContext + 48));
      v21 = ((KUSER_SHARED_DATA.TickCountQuad * KUSER_SHARED_DATA.TickCountMultiplier) >> 24)
          - *((_QWORD *)EnergyContext + 48);
      if( v21 > 0x3E8 )
        v21 = 1000;
      v22 = -1;
      if( ~v21 >= (v20 & 0x7FFFFFFFu) )
        v22 = (v20 & 0x7FFFFFFF) + v21;
      HIDWORD(v46) = (v20 ^ v22) & 0x7FFFFFFF ^ v20;
      LODWORD(v46) = (KUSER_SHARED_DATA.TickCountQuad * KUSER_SHARED_DATA.TickCountMultiplier) >> 24;
      *((_QWORD *)EnergyContext + 48) = v46;
      TimelineBitmapTime = (unsigned int)KeQueryTimelineBitmapTime();
      v16 = (UINT64 *)((char *)EnergyContext + 344);
      goto LABEL_16;
    }
    if( v5 <= 9 )
    {
      v7 = v5 - 4;
      if( v7 )
      {
        v8 = v7 - 1;
        if( v8 )
        {
          v9 = v8 - 2;
          if( v9 )
          {
            if( v9 == 1 )
            {
              memset(&v49[2], 0i64, 0x88u);
              v49[1] = HIDWORD(a3);
              v49[0] = v4;
              PopEtEnergyContextSetState(Process, v49);
            }
            goto LABEL_17;
          }
          v10 = KeQueryTimelineBitmapTime();
          v11 = -1;
          v12 = v10;
          if( (_WORD)v4 )
          {
            v13 = *((_DWORD *)EnergyContext + 32);
            if( ~(unsigned __int16)v4 < v13 )
              v14 = -1;
            else
              v14 = v13 + (unsigned __int16)v4;
            *((_DWORD *)EnergyContext + 32) = v14;
            RtlTimelineBitmapUpdate((UINT64 *)EnergyContext + 40, v12);
          }
          if( WORD1(a3) )
          {
            v18 = *((_DWORD *)EnergyContext + 33);
            v19 = v18 + WORD1(a3);
            if( ~WORD1(a3) < v18 )
              v19 = v11;
            *((_DWORD *)EnergyContext + 33) = v19;
            RtlTimelineBitmapUpdate((UINT64 *)EnergyContext + 41, v12);
          }
          if( !WORD2(a3) )
          {
LABEL_17:
            PopReleaseRwLock((_POP_RW_LOCK *)EnergyContext + 27);
            return;
          }
          v15 = *((_DWORD *)EnergyContext + 34);
          if( ~WORD2(a3) >= v15 )
            v11 = v15 + WORD2(a3);
          *((_DWORD *)EnergyContext + 34) = v11;
          v16 = (UINT64 *)((char *)EnergyContext + 336);
          TimelineBitmapTime = v12;
LABEL_16:
          RtlTimelineBitmapUpdate(v16, TimelineBitmapTime);
          goto LABEL_17;
        }
        RtlStateDurationUpdate(
          (UINT64 *)EnergyContext + 14,
          v4 != 0,
          (KUSER_SHARED_DATA.TickCountQuad * KUSER_SHARED_DATA.TickCountMultiplier) >> 24);
        v28 = KeQueryTimelineBitmapTime();
        v29 = *((_WORD *)EnergyContext + 232);
        v30 = v28;
        v26 = (UINT64 *)((char *)EnergyContext + 312);
        if( v4 )
        {
          *((_WORD *)EnergyContext + 232) = v29 | 2;
          v27 = v28;
          goto LABEL_32;
        }
        *((_WORD *)EnergyContext + 232) = v29 & 0xFFFD;
        v31 = v28;
      }
      else
      {
        RtlStateDurationUpdate(
          (UINT64 *)EnergyContext + 13,
          v4 != 0,
          (KUSER_SHARED_DATA.TickCountQuad * KUSER_SHARED_DATA.TickCountMultiplier) >> 24);
        v23 = KeQueryTimelineBitmapTime();
        v25 = *((_WORD *)EnergyContext + 232);
        v26 = (UINT64 *)((char *)EnergyContext + 304);
        if( v4 )
        {
          v27 = v23;
          *((_WORD *)EnergyContext + 232) = v25 | 1;
LABEL_32:
          RtlTimelineBitmapUpdate(v26, v27);
LABEL_33:
          PopEtEnergyContextProcessStateUpdate(Process);
          goto LABEL_17;
        }
        v31 = v23;
        *((_WORD *)EnergyContext + 232) = v25 & 0xFFFE;
        v30 = v23;
      }
      RtlTimelineBitmapUpdateRange((INT64 *)v26, v31 - (v24 >> 12), v30);
      goto LABEL_33;
    }
    if( v5 <= 11 )
    {
      v32 = v4 == 0;
      v33 = 360i64;
      v34 = !v32;
      if( v5 != 11 )
        v33 = 352i64;
      v35 = (UINT64 *)((char *)EnergyContext + v33);
      v36 = 400i64;
      if( v5 != 11 )
        v36 = 392i64;
      RtlStateDurationUpdate(
        (UINT64 *)((char *)EnergyContext + v36),
        !v32,
        (KUSER_SHARED_DATA.TickCountQuad * KUSER_SHARED_DATA.TickCountMultiplier) >> 24);
      v37 = KeQueryTimelineBitmapTime();
      TimelineBitmapTime = v37;
      v16 = v35;
      if( v34 )
        goto LABEL_16;
      v39 = v37 - (v38 >> 12);
    }
    else
    {
      if( v5 == 13 )
      {
        ++*((_DWORD *)EnergyContext + 106);
        TimelineBitmapTime = (unsigned int)KeQueryTimelineBitmapTime();
        v16 = (UINT64 *)((char *)EnergyContext + 376);
        goto LABEL_16;
      }
      if( v5 != 12 )
      {
        if( v5 == 14 )
          ++*((_DWORD *)EnergyContext + 107);
        goto LABEL_17;
      }
      v40 = (_QWORD *)((char *)EnergyContext + 408);
      if( v4 == 3 )
      {
        if( *((int *)EnergyContext + 103) < 0 )
          goto LABEL_17;
        v43 = HIDWORD(*v40);
        v44 = ((KUSER_SHARED_DATA.TickCountQuad * KUSER_SHARED_DATA.TickCountMultiplier) >> 24) - *v40;
        if( v44 > 0x1000 )
          v44 = 4096;
        v45 = -1;
        if( ~v44 >= (v43 & 0x7FFFFFFFu) )
          v45 = (v43 & 0x7FFFFFFF) + v44;
        HIDWORD(v47) = (v43 ^ v45) & 0x7FFFFFFF ^ v43;
        LODWORD(v47) = (KUSER_SHARED_DATA.TickCountQuad * KUSER_SHARED_DATA.TickCountMultiplier) >> 24;
        *v40 = v47;
        TimelineBitmapTime = (unsigned int)KeQueryTimelineBitmapTime();
LABEL_57:
        v16 = (UINT64 *)((char *)EnergyContext + 368);
        goto LABEL_16;
      }
      if( (unsigned int)(v4 - 1) > 1 )
        goto LABEL_17;
      v41 = *((_DWORD *)EnergyContext + 118);
      if( v4 == 1 )
      {
        *((_DWORD *)EnergyContext + 118) = ++v41;
        if( v41 > 1 )
          goto LABEL_17;
      }
      else if( v41 )
      {
        *((_DWORD *)EnergyContext + 118) = --v41;
        if( v41 )
          goto LABEL_17;
      }
      RtlStateDurationUpdate(
        (UINT64 *)EnergyContext + 51,
        v41 != 0,
        (KUSER_SHARED_DATA.TickCountQuad * KUSER_SHARED_DATA.TickCountMultiplier) >> 24);
      v37 = KeQueryTimelineBitmapTime();
      TimelineBitmapTime = v37;
      if( v41 )
        goto LABEL_57;
      v39 = v37 - (v42 >> 12);
      v16 = (UINT64 *)((char *)EnergyContext + 368);
    }
    RtlTimelineBitmapUpdateRange((INT64 *)v16, v39, v37);
    goto LABEL_17;
  }
}

Referenced by:

NtSetThreadExecutionState
PopProcessDisplayRequiredChange
PsUpdateComponentPower