PopEtEnergyContextSetState

__int64 __fastcall PopEtEnergyContextSetState(_EPROCESS *Process, _DWORD *a2){
  int v2; 
  struct _PO_PROCESS_ENERGY_CONTEXT *EnergyContext; 
  INT64 v4; 
  char v7; 
  int v8; 
  int v9; 
  unsigned int v10; 
  unsigned __int64 v12; 
  _DWORD *v13; 
  INT64 v14; 
  NTSTATUS v15; 
  INT64 v16; 

  v2 = a2[3];
  EnergyContext = Process->EnergyContext;
  v4 = 0i64;
  v16 = 0i64;
  v7 = 0;
  if( (v2 & 1) != 0 )
  {
    v13 = a2 + 4;
    v14 = -1i64;
    do
      ++v14;
    while( *((_WORD *)v13 + v14) );
    if( v14 )
    {
      v15 = PopEtStringIntern((INT64)v13, v14, &v16);
      v4 = v16;
      v10 = v15;
      if( v15 < 0 )
        goto LABEL_7;
    }
    if( *((_QWORD *)EnergyContext + 57) != v4 )
    {
      PopEtStringSet((INT64 *)EnergyContext + 57, v4);
      v7 = 1;
    }
  }
  v8 = *((_DWORD *)EnergyContext + 116);
  v9 = a2[1] | (unsigned __int16)(v8 & ~(unsigned __int16)*a2);
  if( (unsigned __int16)v8 != v9 )
  {
    v12 = (KUSER_SHARED_DATA.TickCountQuad * KUSER_SHARED_DATA.TickCountMultiplier) >> 24;
    RtlStateDurationUpdate((UINT64 *)EnergyContext + 15, (v9 & 4) != 0, (unsigned int)v12);
    RtlStateDurationUpdate((UINT64 *)EnergyContext + 52, (v9 & 8) != 0, (unsigned int)v12);
    v4 = v16;
    v7 = 1;
    *((_WORD *)EnergyContext + 232) = v9;
  }
  if( v7 )
    PopEtEnergyContextProcessStateUpdate(Process);
  v10 = 0;
LABEL_7:
  if( v4 )
    RtlInternEntryDereference(PopEtGlobals + 56, v4);
  return v10;
}

Referenced by:

PoEnergyContextUpdateComponentPower
PoSetProcessEnergyTrackingState