KiForceIdleParkUnparkProcessor
VOID __stdcall KiForceIdleParkUnparkProcessor(_KPRCB *CurrentPrcb, INT8 a2){
unsigned int v3;
unsigned int v4;
unsigned __int64 v5;
bool v6;
int v7;
UINT64 SpinCount;
if( a2 )
{
if( CurrentPrcb->PowerState.Parked )
{
if( !CurrentPrcb->PowerState.SoftParked )
goto LABEL_7;
v4 = KiProcessorIndexToNumberMappingTable[CurrentPrcb->Number];
_InterlockedOr64((volatile signed __int64 *)&KiForceIdleSoftParkRestoreMask.Bitmap[v4 >> 6], 1i64 << (v4 & 0x3F));
}
else
{
v3 = KiProcessorIndexToNumberMappingTable[CurrentPrcb->Number];
_InterlockedOr64((volatile signed __int64 *)&KiForceIdleUnparkRestoreMask.Bitmap[v3 >> 6], 1i64 << (v3 & 0x3F));
}
KeTransitionProcessorParkState(CurrentPrcb);
LABEL_7:
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&CurrentPrcb->PrcbLock, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( CurrentPrcb->PrcbLock );
}
CurrentPrcb->QuantumEnd = 0;
CurrentPrcb->IdleSchedule = 0;
_InterlockedAnd64((volatile signed __int64 *)&CurrentPrcb->PrcbLock, 0i64);
return;
}
v5 = (unsigned __int64)(unsigned int)KiProcessorIndexToNumberMappingTable[CurrentPrcb->Number] >> 6;
v6 = CurrentPrcb->PowerState.SoftParked == 0;
v7 = KiProcessorIndexToNumberMappingTable[CurrentPrcb->Number];
if( v6 )
_InterlockedAnd64((volatile signed __int64 *)&KiForceIdleUnparkRestoreMask.Bitmap[v5], ~(1i64 << (v7 & 0x3F)));
else
_InterlockedAnd64((volatile signed __int64 *)&KiForceIdleSoftParkRestoreMask.Bitmap[v5], ~(1i64 << (v7 & 0x3F)));
KeTransitionProcessorParkState(CurrentPrcb);
}Referenced by:
KiForceIdleParkUnparkDpcRoutine
KiForceIdleUpdateSchedulerParkState