PpmParkComputeUnparkMask
__int64 __fastcall PpmParkComputeUnparkMask(
unsigned __int16 a1,
UINT64 a2,
__int64 a3,
__int64 a4,
unsigned int UnparkCount,
unsigned int a6,
UINT64 OsUnpark,
UINT64 PlatformPark,
UINT64 *a9,
UINT64 *a10,
_DWORD *a11){
__int64 v13;
__int64 result;
UINT64 v15;
UINT64 v16;
__int64(__fastcall *v17)(_QWORD, _QWORD, _QWORD, __int64 *, int *, __int64 *, UINT64 *, UINT64 *);
__int16 v18;
unsigned __int16 v19;
__int64 v20;
UINT64 v21;
__int64 v22;
UINT64 PlatformUnpark;
UINT64 a7;
UINT64 v25;
UINT64 v26;
UINT64 v27;
UINT64 v28;
UINT64 v29;
__int64 v30;
UINT64 v31;
UINT64 v32;
unsigned __int64 v33;
_KPRCB *Prcb;
_KPRCB *v35;
unsigned __int64 CoreProcessorSet;
unsigned __int64 v37;
unsigned int v38;
unsigned __int64 v39;
UINT64 v40;
void(__fastcall *v42)(_QWORD, __int64, _QWORD, __int64 *, int *, __int64 *, UINT64 *, UINT64 *);
UINT64 v43;
unsigned int v45;
UINT64 v46;
__int64 v48;
__int64 v49[22];
__int64 v50[22];
UINT64 v51[22];
UINT64 v52[22];
int v53[44];
v13 = a1;
memset(v53, 0i64, 0xA8u);
memset(v49, 0i64, 0xA8u);
memset(v51, 0i64, 0xA8u);
memset(v50, 0i64, 0xA8u);
result = (__int64)memset(v52, 0i64, 0xA8u);
*a9 = 0i64;
*a10 = 0i64;
if( !a6 )
{
*a9 = a2;
return result;
}
v15 = a2 - ((a2 >> 1) & 0x5555555555555555i64);
result = (0x101010101010101i64
* (((v15 & 0x3333333333333333i64)
+ ((v15 >> 2) & 0x3333333333333333i64)
+ (((v15 & 0x3333333333333333i64) + ((v15 >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 56;
if( a6 == (_DWORD)result && !UnparkCount )
{
*a10 = a2;
return result;
}
v16 = (v15 & 0x3333333333333333i64) + (((a2 - ((a2 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64);
result = (0x101010101010101i64 * ((v16 + (v16 >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 56;
if( UnparkCount != (_DWORD)result )
{
if( UnparkCount
&& (v42 = (void(__fastcall *)(_QWORD, __int64, _QWORD, __int64 *, int *, __int64 *, UINT64 *, UINT64 *))*(&stru_140C23628 + 479)) != 0i64 )
{
LODWORD(v50[0]) = 1310721;
memset((char *)v50 + 4, 0i64, 0xA4u);
v53[0] = 1310721;
memset(&v53[1], 0i64, 0xA4u);
LODWORD(v49[0]) = 1310721;
memset((char *)v49 + 4, 0i64, 0xA4u);
LODWORD(v51[0]) = 1310721;
memset((char *)v51 + 4, 0i64, 0xA4u);
LODWORD(v52[0]) = 1310721;
memset((char *)v52 + 4, 0i64, 0xA4u);
v18 = 1;
if( (_WORD)v13 )
v18 = v13 + 1;
LOWORD(v50[0]) = v18;
v19 = v49[0];
v50[v13 + 1] |= a2;
if( v19 <= (unsigned __int16)v13 )
v19 = v13 + 1;
LOWORD(v49[0]) = v19;
v49[v13 + 1] |= OsUnpark;
v20 = v49[v13 + 1];
if( LOWORD(v49[0]) <= (unsigned __int16)v13 )
{
LOWORD(v49[0]) = v13 + 1;
v20 = v49[v13 + 1];
}
v21 = PlatformPark;
v22 = *(&PopIrpWorkerControlEvent + 152);
v49[v13 + 1] = PlatformPark | v20;
v42(0i64, v22, UnparkCount, v50, v53, v49, v51, v52);
if( (unsigned __int16)v13 >= LOWORD(v51[0]) )
PlatformUnpark = 0i64;
else
PlatformUnpark = v51[v13 + 1];
if( (unsigned __int16)v13 >= LOWORD(v52[0]) )
a7 = 0i64;
else
a7 = v52[v13 + 1];
PpmEventParkNodePreference(v13, a2, UnparkCount, OsUnpark, PlatformPark, PlatformUnpark, a7);
v25 = ~(PlatformPark | OsUnpark);
v26 = v25 & PlatformUnpark;
v27 = v25 & a7;
}
else
{
v21 = PlatformPark;
v26 = 0i64;
v27 = 0i64;
}
v46 = v26;
*a9 = a2;
v28 = a2 & ~(v21 | OsUnpark | v26 | v27);
if( (a2 & v21) != 0 )
{
*a11 |= 0x200u;
v29 = PlatformPark & *a9;
}
else if( (a2 & v27) != 0 )
{
*a11 |= 0x400u;
v29 = v27 & *a9;
}
else if( (a2 & ~(v21 | OsUnpark | v26 | v27)) != 0 )
{
*a11 |= 0x800u;
v29 = v28 & *a9;
}
else
{
v29 = v26 & a2;
if( (v26 & a2) != 0 )
*a11 |= 0x80000u;
else
v29 = 0i64;
}
v30 = a3;
v31 = v29;
v43 = v29;
result = a4 & (a2 ^ a3);
v45 = 0;
v48 = result;
while( 1 )
{
if( !v31 )
return result;
if( ((PopHeteroSystem - 3) & 0xFFFFFFFD) == 0 )
{
*a11 |= 0x8000u;
v32 = PpmHeteroRestrictToFavoredClass(v31);
v30 = a3;
v31 = v32;
}
if( (v48 & v31) != 0 )
{
*a11 |= 0x1000u;
v31 &= v48;
}
if( (v31 & ~v30) != 0 )
{
*a11 |= 0x2000u;
v31 &= ~v30;
}
_BitScanForward64(&v33, v31);
Prcb = KeGetPrcb((unsigned int)KiProcessorNumberToIndexMappingTable[64 * a1 + (v33 & 0x3F)]);
v35 = Prcb;
if( PpmParkCoreMask )
CoreProcessorSet = Prcb->CoreProcessorSet;
else
CoreProcessorSet = Prcb->GroupSetMember;
*a9 &= ~CoreProcessorSet;
if( v45 >= UnparkCount )
*a10 |= CoreProcessorSet;
v37 = ((CoreProcessorSet - ((CoreProcessorSet >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
+ (((CoreProcessorSet - ((CoreProcessorSet >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64);
v38 = ((unsigned int)((0x101010101010101i64 * ((v37 + (v37 >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 32) >> 24) + v45;
v45 = v38;
v31 &= ~Prcb->ParentNode->Affinity.Mask;
v39 = ~Prcb->PackageProcessorSet.Bitmap[Prcb->Group] & v43;
result = ~Prcb->CoreProcessorSet;
v29 &= result;
v43 &= ~v35->PackageProcessorSet.Bitmap[v35->Group];
if( !v31 )
break;
LABEL_65:
v30 = a3;
if( v38 >= a6 )
return result;
}
if( v39 )
{
LABEL_64:
v31 = v39;
goto LABEL_65;
}
if( !v29 )
{
v40 = *a9;
result = PlatformPark;
if( (*a9 & PlatformPark) != 0 )
{
*a11 |= 0x200u;
}
else
{
if( (v40 & v27) == 0 )
{
if( (v40 & v28) != 0 )
{
*a11 |= 0x800u;
v29 = v28 & *a9;
}
else if( (v40 & v46) != 0 )
{
*a11 |= 0x80000u;
v29 = v46 & *a9;
}
else
{
v29 = 0i64;
}
goto LABEL_63;
}
*a11 |= 0x400u;
}
v29 = PlatformPark & *a9;
}
LABEL_63:
v39 = v29;
v43 = v29;
goto LABEL_64;
}
v17 = (__int64(__fastcall *)(_QWORD, _QWORD, _QWORD, __int64 *, int *, __int64 *, UINT64 *, UINT64 *))*(&stru_140C23628 + 479);
if( *(&stru_140C23628 + 479) && a3 )
{
LODWORD(v50[0]) = 1310721;
memset((char *)v50 + 4, 0i64, 0xA4u);
v53[0] = 1310721;
memset(&v53[1], 0i64, 0xA4u);
LODWORD(v49[0]) = 1310721;
memset((char *)v49 + 4, 0i64, 0xA4u);
LODWORD(v51[0]) = 1310721;
memset((char *)v51 + 4, 0i64, 0xA4u);
LODWORD(v52[0]) = 1310721;
memset((char *)v52 + 4, 0i64, 0xA4u);
if( (_WORD)v13 )
LOWORD(v50[0]) = v13 + 1;
v50[v13 + 1] |= a2;
return v17(0i64, *(&PopIrpWorkerControlEvent + 152), UnparkCount, v50, v53, v49, v51, v52);
}
return result;
}Referenced by:
PpmParkCalculateCoreParkingMask