PpmTestAndLockProcessor
INT64 __fastcall PpmTestAndLockProcessor(INT64 a1, _WORD *a2, INT64 a3){
UINT64 *v3;
UINT32 *v4;
UINT32 v5;
__int64 v6;
_WORD *v8;
_RTL_PROCESS_MODULES *v9;
unsigned int v11;
unsigned int v12;
__int64 i;
unsigned __int64 v14;
__int64 v15;
__int64 v16;
__int64 v17;
_LIST_ENTRY LoadOrderListHead;
INT64 v20;
__int64 v21;
v4 = (UINT32 *)(a1 + 32832);
v5 = *(_DWORD *)(a1 + 32832);
v6 = 0i64;
v21 = 0x100000000i64;
v20 = a1;
v8 = a2;
v9 = PopIdleTransitionTimeout;
LoadOrderListHead.Flink = 0i64;
LoadOrderListHead.Blink = (_LIST_ENTRY *)PopIdleTransitionTimeout;
if( (v5 & 0xFF000000) == 0x2000000 )
{
do
{
PpmIdleTransitionStall(&LoadOrderListHead, v9, a3, v3);
v5 = *v4;
}
while( (*v4 & 0xFF000000) == 0x2000000 );
v8 = a2;
}
v11 = -1073741782;
if( HIBYTE(v5) - 3 <= 2u )
{
if( a3 )
{
v12 = *(_DWORD *)a3;
for( i = 0i64; (unsigned int)i < v12; i = (unsigned int)(i + 1) )
{
v6 = *(_QWORD *)(a3 + 8) + 24 * i;
if( *(_DWORD *)(v6 + 4) == *(_DWORD *)(a1 + 32820) )
break;
}
if( (_DWORD)i == v12 || !*(_BYTE *)(v6 + 2) )
return v11;
if( !*(_BYTE *)v6 )
return 0;
}
v14 = (unsigned int)KiProcessorIndexToNumberMappingTable[*(unsigned int *)(a1 + 36)];
v15 = *(_QWORD *)&v8[4 * (v14 >> 6) + 4] >> (v14 & 0x3F);
if( (v15 & 1) != 0 )
return 0;
LODWORD(v15) = *((_DWORD *)KeGetPcr() + 105);
v16 = *(_QWORD *)(a1 + 0x8000);
v17 = (unsigned int)v15;
_InterlockedOr64(
(volatile signed __int64 *)(v16
+ 8 * ((unsigned __int64)(unsigned int)KiProcessorIndexToNumberMappingTable[v15] >> 6)
+ 80),
1i64 << (KiProcessorIndexToNumberMappingTable[v15] & 0x3F));
v11 = PpmIdleLockProcessor(v4);
if( (v11 & 0x80000000) != 0 )
{
_InterlockedAnd64(
(volatile signed __int64 *)(v16
+ 8 * ((unsigned __int64)(unsigned int)KiProcessorIndexToNumberMappingTable[v17] >> 6)
+ 80),
~(1i64 << (KiProcessorIndexToNumberMappingTable[v17] & 0x3F)));
return v11;
}
KeAddProcessorAffinityEx(a2, *(_DWORD *)(a1 + 36));
if( !a3 || *(_DWORD *)(v6 + 4) == *(_DWORD *)(a1 + 32820) )
return 0;
}
return v11;
}Referenced by:
PpmIdleCheckCoordinatedDependencies
PpmIdleCheckCoordinatedDependency
PpmIdleExecuteTransition