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