PoIdle
void __fastcall PoIdle(ULONG_PTR BugCheckParameter4){
unsigned __int16 v1;
__int64 v3;
unsigned int *v4;
UINT64 v5;
__int64 v6;
unsigned __int64 v7;
__int64 v8;
__int64 v9;
__int64 *v10;
unsigned int v11;
__int64 v12;
unsigned int v13;
unsigned int v14;
unsigned int v15;
UINT64 v16;
__int64 v18;
unsigned __int16 v19;
char v20;
unsigned __int16 v21;
struct _KPRCB *CurrentPrcb;
__int64 v23;
unsigned int v24;
unsigned int NextNode;
__int64 v26;
bool v27;
char v28[3];
unsigned int v29;
unsigned int v30;
__int64 v31;
UINT64 LookupIndex;
__int64 v33;
UINT64 DurationHINT64;
__int64 v35;
int v36;
INT64 result;
_QWORD result_4[21];
v1 = 0;
v28[0] = 0;
v31 = 0i64;
v33 = 0i64;
v35 = 0i64;
v27 = 0;
v30 = 0;
v29 = 0;
memset((INT64)result_4, 0i64);
if( *((_BYTE *)PpmCurrentProfile + 2736 * dword_140C23D0C + 189) )
return;
v3 = *(_QWORD *)(BugCheckParameter4 + 0x8000);
v4 = *(unsigned int **)(BugCheckParameter4 + 32776);
v5 = 0i64;
DurationHINT64 = 0i64;
if( !v3 )
goto LABEL_56;
*(_DWORD *)(v3 + 796) = 0;
v6 = *(_QWORD *)(BugCheckParameter4 + 0x8000);
if( *(_BYTE *)(v6 + 5) )
{
v7 = *(_QWORD *)(BugCheckParameter4 + 32784);
*(_QWORD *)(BugCheckParameter4 + 32784) = 0i64;
v8 = *(unsigned int *)(v6 + 20);
*(_QWORD *)(BugCheckParameter4 + 32792) += v7;
v9 = *(_QWORD *)(BugCheckParameter4 + 32776) + 1000 * v8;
*(_QWORD *)(v9 + 40) += v7;
if( *(_DWORD *)(v6 + 68) == 3 )
{
if( *(int *)(v6 + 64) < 0 )
{
++*(_DWORD *)(v9 + 52);
}
else
{
++*(_DWORD *)(v9 + 56);
v10 = &PpmIdleIntervalLimits;
v11 = 0;
while( v7 >= *v10 )
{
if( v7 < v10[3] )
{
++v11;
break;
}
v10 += 6;
v11 += 2;
if( v11 >= 0x1A )
goto LABEL_58;
}
if( v11 >= 0x1A )
{
LABEL_58:
++*(_DWORD *)(v9 + 60);
goto LABEL_17;
}
v12 = 32i64 * v11;
*(_QWORD *)(v12 + v9 + 208) += v7;
++*(_DWORD *)(v12 + v9 + 232);
if( v7 < *(_QWORD *)(v12 + v9 + 216) )
*(_QWORD *)(v12 + v9 + 216) = v7;
if( v7 > *(_QWORD *)(v12 + v9 + 224) )
*(_QWORD *)(v12 + v9 + 224) = v7;
LABEL_17:
if( v7 < *(_QWORD *)(v9 + 64) )
*(_QWORD *)(v9 + 64) = v7;
if( v7 > *(_QWORD *)(v9 + 72) )
*(_QWORD *)(v9 + 72) = v7;
}
}
else
{
++*(_DWORD *)(v9 + 48);
}
}
*(_DWORD *)(v6 + 64) = 0;
*(_DWORD *)(v6 + 68) = 3;
*(_BYTE *)(v6 + 5) = 0;
*(_BYTE *)(v3 + 5) = 1;
v36 = 1310721;
memset((INT64)&result, 0i64);
*(_WORD *)(v3 + 48) = 0;
if( !*(_BYTE *)v3 )
{
v13 = PpmIdlePrepare(
BugCheckParameter4,
v28,
(LARGE_INTEGER *)&v31,
(unsigned __int64 *)&v33,
&DurationHINT64,
&v36);
v14 = v13;
v29 = v13;
if( v13 != -2 )
{
if( v13 == -1 )
{
++v4[3];
return;
}
v15 = *(_DWORD *)(v3 + 560);
v30 = v15;
if( v15 != -1 )
{
**(_DWORD **)(v3 + 808) = v15;
*(_DWORD *)(v3 + 796) = 1;
}
v5 = DurationHINT64;
v27 = *(_BYTE *)(248i64 * v13 + v3 + 1058) == 0;
goto LABEL_27;
}
LABEL_56:
HalProcessorIdle();
return;
}
if( PpmIdleVetoBias && *(_BYTE *)(v3 + 8) )
goto LABEL_56;
PpmIdleSelectStates(
BugCheckParameter4,
(unsigned __int64)&v31,
(unsigned __int64 *)&v33,
v28,
&v29,
(int *)&v30,
&v35,
&v27);
v14 = v29;
LABEL_27:
v16 = *(unsigned int *)(v3 + 16);
if( v14 != (_DWORD)v16 )
{
*(_DWORD *)(v3 + 24) = v16;
*(_DWORD *)(v3 + 16) = v14;
PpmEventIdleStateChange(v14, v16);
}
if( v4[1]++ == -1 )
PpmResetProcessorIdleAccounting(v4, v31);
v18 = *(_QWORD *)(BugCheckParameter4 + 0x8000);
v19 = 0;
v20 = *(_BYTE *)(248i64 * v14 + v3 + 1057);
v21 = v36;
if( (_WORD)v36 )
{
while( !result_4[v19] )
{
if( ++v19 >= (unsigned __int16)v36 )
goto LABEL_34;
}
*(_WORD *)(v18 + 48) |= 0x400u;
if( KiSerializeTimerExpiration && v5 )
PpmSetPlatformIdleDurationHint(v5);
v21 = v36;
}
LABEL_34:
if( !(_BYTE)KiDynamicTickDisableReason
&& !PpmIpiLastClockOwnerDisable
&& !*(_BYTE *)(BugCheckParameter4 + 33)
&& *((_BYTE *)*(&KiProcessorBlock + (unsigned int)KiClockTimerOwner) + 33)
&& !v20 )
{
CurrentPrcb = KeGetCurrentPrcb();
LODWORD(LookupIndex) = 0;
v23 = *((_QWORD *)CurrentPrcb + 24);
v24 = *(unsigned __int16 *)(v23 + 146);
if( (*(_QWORD *)(v23 + 64) & ~(1i64 << *((_BYTE *)CurrentPrcb + 209))) == (*(_QWORD *)(v23 + 136) & ~(1i64 << (KiProcessorIndexToNumberMappingTable[*((unsigned int *)CurrentPrcb + 9)] & 0x3F))) )
{
while( 1 )
{
NextNode = MmGetNextNode(v24, &LookupIndex);
if( NextNode == -1 )
break;
if( *(_QWORD *)(*((_QWORD *)&KeNodeBlock + NextNode) + 64i64) != *(_QWORD *)(*((_QWORD *)&KeNodeBlock + NextNode)
+ 136i64) )
goto LABEL_40;
}
if( ((result_4[(unsigned __int64)(unsigned int)KiProcessorIndexToNumberMappingTable[v26] >> 6] >> (KiProcessorIndexToNumberMappingTable[v26] & 0x3F)) & 1) == 0 )
{
KeAddProcessorAffinityEx(&v36, v26);
*(_WORD *)(v18 + 48) |= 0x800u;
}
}
LABEL_40:
v14 = v29;
v21 = v36;
}
if( v21 )
{
while( !result_4[v1] )
{
if( ++v1 >= v21 )
goto LABEL_44;
}
HalRequestIpi(0, &v36);
}
LABEL_44:
PpmIdleExecuteTransition(BugCheckParameter4, v14, v30, v35, v28[0], v31, v33, v27);
}Referenced by:
KiIdleLoop