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