PoEnergyContextUpdateComponentPower
void __fastcall PoEnergyContextUpdateComponentPower(_QWORD *a1, int a2, __int64 a3){
__int64 v3;
int v4;
int v7;
int v8;
int v9;
unsigned int 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;
INT64 result;
INT64 v50[17];
v3 = a1[285];
v4 = a3;
memset((INT64)&result, 0i64);
if( v3 )
{
PopAcquireRwLockExclusive((_POP_RW_LOCK *)(v3 + 432));
if( a2 == 9 )
{
v20 = HIDWORD(*(_QWORD *)(v3 + 384));
v21 = ((KUSER_SHARED_DATA.TickCountQuad * KUSER_SHARED_DATA.TickCountMultiplier) >> 24) - *(_QWORD *)(v3 + 384);
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 *)(v3 + 384) = v46;
TimelineBitmapTime = (unsigned int)KeQueryTimelineBitmapTime();
v16 = (UINT64 *)(v3 + 344);
goto LABEL_16;
}
if( a2 <= 9 )
{
v7 = a2 - 4;
if( v7 )
{
v8 = v7 - 1;
if( v8 )
{
v9 = v8 - 2;
if( v9 )
{
if( v9 == 1 )
{
memset((INT64)v50, 0i64);
HIDWORD(result) = HIDWORD(a3);
LODWORD(result) = v4;
PopEtEnergyContextSetState(a1, &result);
}
goto LABEL_17;
}
v10 = KeQueryTimelineBitmapTime();
v11 = -1;
v12 = v10;
if( (_WORD)v4 )
{
v13 = *(_DWORD *)(v3 + 128);
if( ~(unsigned __int16)v4 < v13 )
v14 = -1;
else
v14 = v13 + (unsigned __int16)v4;
*(_DWORD *)(v3 + 128) = v14;
RtlTimelineBitmapUpdate((UINT64 *)(v3 + 320), v12);
}
if( WORD1(a3) )
{
v18 = *(_DWORD *)(v3 + 132);
v19 = v18 + WORD1(a3);
if( ~WORD1(a3) < v18 )
v19 = v11;
*(_DWORD *)(v3 + 132) = v19;
RtlTimelineBitmapUpdate((UINT64 *)(v3 + 328), v12);
}
if( !WORD2(a3) )
{
LABEL_17:
PopReleaseRwLock(v3 + 432);
return;
}
v15 = *(_DWORD *)(v3 + 136);
if( ~WORD2(a3) >= v15 )
v11 = v15 + WORD2(a3);
*(_DWORD *)(v3 + 136) = v11;
v16 = (UINT64 *)(v3 + 336);
TimelineBitmapTime = v12;
LABEL_16:
RtlTimelineBitmapUpdate(v16, TimelineBitmapTime);
goto LABEL_17;
}
RtlStateDurationUpdate(
(UINT64 *)(v3 + 112),
v4 != 0,
(KUSER_SHARED_DATA.TickCountQuad * KUSER_SHARED_DATA.TickCountMultiplier) >> 24);
v28 = KeQueryTimelineBitmapTime();
v29 = *(_WORD *)(v3 + 464);
v30 = v28;
v26 = (UINT64 *)(v3 + 312);
if( v4 )
{
*(_WORD *)(v3 + 464) = v29 | 2;
v27 = v28;
goto LABEL_32;
}
*(_WORD *)(v3 + 464) = v29 & 0xFFFD;
v31 = v28;
}
else
{
RtlStateDurationUpdate(
(UINT64 *)(v3 + 104),
v4 != 0,
(KUSER_SHARED_DATA.TickCountQuad * KUSER_SHARED_DATA.TickCountMultiplier) >> 24);
v23 = KeQueryTimelineBitmapTime();
v25 = *(_WORD *)(v3 + 464);
v26 = (UINT64 *)(v3 + 304);
if( v4 )
{
v27 = v23;
*(_WORD *)(v3 + 464) = v25 | 1;
LABEL_32:
RtlTimelineBitmapUpdate(v26, v27);
LABEL_33:
PopEtEnergyContextProcessStateUpdate(a1);
goto LABEL_17;
}
v31 = v23;
*(_WORD *)(v3 + 464) = v25 & 0xFFFE;
v30 = v23;
}
RtlTimelineBitmapUpdateRange((INT64 *)v26, v31 - (v24 >> 12), v30);
goto LABEL_33;
}
if( a2 <= 11 )
{
v32 = v4 == 0;
v33 = 360i64;
v34 = !v32;
if( a2 != 11 )
v33 = 352i64;
v35 = (UINT64 *)(v3 + v33);
v36 = 400i64;
if( a2 != 11 )
v36 = 392i64;
RtlStateDurationUpdate(
(UINT64 *)(v3 + 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( a2 == 13 )
{
++*(_DWORD *)(v3 + 424);
TimelineBitmapTime = (unsigned int)KeQueryTimelineBitmapTime();
v16 = (UINT64 *)(v3 + 376);
goto LABEL_16;
}
if( a2 != 12 )
{
if( a2 == 14 )
++*(_DWORD *)(v3 + 428);
goto LABEL_17;
}
v40 = (_QWORD *)(v3 + 408);
if( v4 == 3 )
{
if( *(int *)(v3 + 412) < 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 *)(v3 + 368);
goto LABEL_16;
}
if( (unsigned int)(v4 - 1) > 1 )
goto LABEL_17;
v41 = *(_DWORD *)(v3 + 472);
if( v4 == 1 )
{
*(_DWORD *)(v3 + 472) = ++v41;
if( v41 > 1 )
goto LABEL_17;
}
else if( v41 )
{
*(_DWORD *)(v3 + 472) = --v41;
if( v41 )
goto LABEL_17;
}
RtlStateDurationUpdate(
(UINT64 *)(v3 + 408),
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 *)(v3 + 368);
}
RtlTimelineBitmapUpdateRange((INT64 *)v16, v39, v37);
goto LABEL_17;
}
}Referenced by:
NtSetThreadExecutionState
PopProcessDisplayRequiredChange
PsUpdateComponentPower