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