KiSetProcessorIdle
VOID __stdcall KiSetProcessorIdle(_KPRCB *Prcb, UINT64 Idle, UINT64 IdleSchedule){
__int64 v3;
int v4;
__int64 v5;
int v6;
unsigned __int64 v7;
unsigned __int64 v8;
int v9;
v3 = *((_QWORD *)Prcb + 24);
v4 = *((unsigned __int8 *)Prcb + 35);
if( (_DWORD)Idle )
{
v5 = *((_QWORD *)Prcb + 4247);
if( v5 )
*(_BYTE *)(v5 + 16) = 1;
*((_BYTE *)Prcb + 12587) = IdleSchedule;
if( (v4 & 1) != 0 )
{
v6 = v4 - 1;
*((_BYTE *)Prcb + 35) = v6;
if( !v6 )
_interlockedbittestandset64((volatile signed __int32 *)v3, *((unsigned __int8 *)Prcb + 209));
_interlockedbittestandset64((volatile signed __int32 *)(v3 + 24), *((unsigned __int8 *)Prcb + 209));
v7 = *((_QWORD *)Prcb + 4235);
if( (*(_QWORD *)(v3 + 24) & v7) == v7 )
{
_InterlockedOr64((volatile signed __int64 *)(v3 + 8), v7);
}
else
{
v8 = *((_QWORD *)Prcb + 4235) & ~*(_QWORD *)(v3 + 24);
if( ((v8 - 1) & v8) == 0 )
_InterlockedOr64((volatile signed __int64 *)(v3 + 16), v8);
}
_interlockedbittestandreset64((volatile signed __int32 *)(v3 + 16), *((unsigned __int8 *)Prcb + 209));
}
}
else
{
*((_BYTE *)Prcb + 12587) = 0;
if( (v4 & 1) != 0 )
__fastfail(0x21u);
v9 = v4 + 1;
*((_BYTE *)Prcb + 35) = v9;
if( v9 == 1 )
_interlockedbittestandreset64((volatile signed __int32 *)v3, *((unsigned __int8 *)Prcb + 209));
_interlockedbittestandreset64((volatile signed __int32 *)(v3 + 24), *((unsigned __int8 *)Prcb + 209));
_InterlockedAnd64((volatile signed __int64 *)(v3 + 8), ~*((_QWORD *)Prcb + 4235));
_InterlockedAnd64((volatile signed __int64 *)(v3 + 16), ~*((_QWORD *)Prcb + 4235));
if( (*((_QWORD *)Prcb + 4235) & ~*(_QWORD *)(v3 + 24)) == *((_QWORD *)Prcb + 25) )
_interlockedbittestandset64((volatile signed __int32 *)(v3 + 16), *((unsigned __int8 *)Prcb + 209));
}
}Referenced by:
KeTransitionProcessorParkState
KiCompleteKernelInit
KiGroupSchedulingGenerationEnd
KiSchedulerApc
KiSearchForNewThread
KiSelectNextThread