KiUpdateGlobalCpuSetConfiguration
VOID __stdcall KiUpdateGlobalCpuSetConfiguration(_SINGLE_LIST_ENTRY *ReadyList){
__int64 i;
__int64 v3;
INT64 v4;
int v5;
int v6;
_ETHREAD *v7;
int v8;
INT64 v9;
char v10;
int v11;
_KPRCB *v12;
__int64 v13;
char v14;
UINT8 IsThreadRankNonZero;
INT64 v16;
UINT64 v17;
UINT64 v18;
UINT64 v19;
UINT64 SpinCount;
for( i = 0i64; (unsigned int)i < (unsigned int)KeNumberProcessors_0; i = (unsigned int)(i + 1) )
{
v3 = (__int64)*(&KiProcessorBlock + i);
*(_QWORD *)(*(_QWORD *)(v3 + 24) + 568i64) = KiCpuSetSequence;
while( 1 )
{
LODWORD(v18) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(v3 + 48), 0i64) )
{
do
KeYieldProcessorEx(&v18);
while( *(_QWORD *)(v3 + 48) );
}
v4 = *(_QWORD *)(v3 + 8);
if( KiTryToAcquireThreadLock((_KTHREAD *)v4, 0i64) )
break;
_InterlockedAdd16((volatile signed __int16 *)(v4 + 868), 1u);
_InterlockedAnd64((volatile signed __int64 *)(v3 + 48), 0i64);
LODWORD(v19) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(v4 + 64), 0i64) )
{
do
KeYieldProcessorEx(&v19);
while( *(_QWORD *)(v4 + 64) );
}
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(v3 + 48), 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(_QWORD *)(v3 + 48) );
}
_InterlockedDecrement16((volatile signed __int16 *)(v4 + 868));
if( v4 == *(_QWORD *)(v3 + 8) )
break;
_InterlockedAnd64((volatile signed __int64 *)(v3 + 48), 0i64);
KiReleaseThreadLockSafe(v4);
}
v5 = *(_DWORD *)(v4 + 588);
v6 = 0;
if( !(unsigned int)KiCheckThreadAffinity((_KTHREAD *)v4) )
{
KiComputeThreadAffinity(&v7->Tcb);
v10 = *(_BYTE *)(v4 + 388);
if( v10 == 2 || v10 == 5 )
{
KiRescheduleThreadAfterAffinityChange(
(_ETHREAD *)v4,
(_GROUP_AFFINITY *)(v4 + 576),
2u,
(_KPRCB *)v3,
0i64,
ReadyList);
v6 = v11;
}
}
v8 = *(_DWORD *)(v4 + 588);
KiReleaseThreadLockSafe(v4);
if( (xmmword_140CFB490 & 0x8000000) != 0 )
EtwTraceIdealProcessor(v4, 0x546u, v5, v8);
v9 = *(_QWORD *)(v3 + 16);
if( v9 && !(unsigned int)KiCheckThreadAffinity(*(_KTHREAD **)(v3 + 16)) )
{
v13 = *(_QWORD *)(v3 + 8);
if( (*(_BYTE *)(v13 + 2) & 4) == 0
|| (IsThreadRankNonZero = KiIsThreadRankNonZero(*(_KTHREAD **)(v3 + 8), (_KPRCB *)v3, v12),
v14 = 1,
!IsThreadRankNonZero) )
{
v14 = *(_BYTE *)(v13 + 195);
}
**(_BYTE **)(v3 + 56) = v14;
if( *(_QWORD *)(v3 + 33976) )
{
v16 = (unsigned int)KiVpThreadSystemWorkPriority;
if( v13 != *(_QWORD *)(v3 + 24) )
v16 = (unsigned int)v14;
KiSetSchedulerAssistPriority(*(INT32 **)(v3 + 33976), v16, 0);
}
KiSelectNextThread((_KPRCB *)v3, ReadyList);
_interlockedbittestandreset((volatile signed __int32 *)(v9 + 120), 0xCu);
KiInsertDeferredReadyList((INT64)ReadyList, v9);
}
_InterlockedAnd64((volatile signed __int64 *)(v3 + 48), 0i64);
if( v6 )
{
v17 = *(unsigned int *)(v3 + 36);
if( KeGetPcr()->Prcb.Number != (_DWORD)v17 )
KiSendSoftwareInterrupt(v17, 2u);
}
}
}Referenced by:
KeCpuSetReportParkedProcessors