PpmUnlockProcessors
__int64 __fastcall PpmUnlockProcessors(unsigned __int16 *a1, __int64 a2){
__int64 v2;
__int64 v5;
__int64 v6;
__int64 v7;
unsigned __int32 v8;
unsigned __int32 v9;
int v10;
__int64 IsEmptyAffinity;
UINT64 ProcessorNumber;
unsigned __int16 *v13[2];
__int16 v14;
int v15;
__int16 v16;
int v17;
INT64 result[21];
v15 = 0;
v16 = 0;
LODWORD(ProcessorNumber) = 0;
memset((INT64)result + 4, 0i64);
v17 = 1310721;
memset((INT64)result, 0i64);
LODWORD(v2) = *((_DWORD *)KeGetPcr() + 105);
v13[1] = *(unsigned __int16 **)(a2 + 8);
v14 = 0;
v13[0] = (unsigned __int16 *)a2;
while( !(unsigned int)KeEnumerateNextProcessor(&ProcessorNumber, v13) )
{
KeGetPrcb((unsigned int)ProcessorNumber);
v6 = v5;
v7 = *(_QWORD *)(v5 + 0x8000);
_m_prefetchw((const void *)(v5 + 32832));
v8 = *(_DWORD *)(v5 + 32832);
do
{
v9 = v8;
v10 = v8 ^ (v8 ^ (v8 - 1)) & 0xFFFFFF;
if( (v10 & 0xFFFFFF) == 0 )
{
if( HIBYTE(v8) == 5 )
{
v10 = v10 & 0xFFFFFF | 0x4000000;
}
else if( HIBYTE(v8) == 7 )
{
v10 = v10 & 0xFFFFFF | 0x6000000;
}
}
v8 = _InterlockedCompareExchange((volatile signed __int32 *)(v6 + 32832), v10, v8);
}
while( v8 != v9 );
if( HIBYTE(v10) == 6 )
KeAddProcessorAffinityEx(&v17, ProcessorNumber);
_InterlockedAnd64(
(volatile signed __int64 *)(v7
+ 8 * ((unsigned __int64)(unsigned int)KiProcessorIndexToNumberMappingTable[v2] >> 6)
+ 80),
~(1i64 << (KiProcessorIndexToNumberMappingTable[v2] & 0x3F)));
KeRemoveProcessorAffinityEx(a1, ProcessorNumber);
}
IsEmptyAffinity = KeIsEmptyAffinityEx(&v17);
if( !(_DWORD)IsEmptyAffinity )
return HalRequestIpi(0, &v17);
return IsEmptyAffinity;
}Referenced by:
PpmIdleSelectStates