KiForceIdleUpdateSchedulerParkState

NTSTATUS __stdcall KiForceIdleUpdateSchedulerParkState(UINT8 a1){
  VOID *v1; 
  struct _KPRCB *CurrentPrcb; 
  unsigned int v3; 
  NTSTATUS v4; 
  NTSTATUS result; 
  _KPRCB *Prcb; 
  UINT64 ProcIndex; 
  _KAFFINITY_ENUMERATION_CONTEXT ProcIndex_8; 
  _KAFFINITY_EX Dest; 

  v1 = (VOID *)a1;
  memset(&ProcIndex_8, 0, sizeof(ProcIndex_8));
  memset(&Dest, 0i64, sizeof(Dest));
  LODWORD(ProcIndex) = 0;
  CurrentPrcb = KeGetCurrentPrcb();
  while( KiForceIdlePendingDpcCount )
    _mm_pause();
  if( (_BYTE)v1 )
  {
    KeCopyAffinityEx(&Dest, &KeActiveProcessors);
  }
  else
  {
    KeCopyAffinityEx(&Dest, &KiForceIdleUnparkRestoreMask);
    KeOrAffinityEx((INT8 *)&Dest, &KiForceIdleSoftParkRestoreMask.Count, (INT8 *)&Dest);
  }
  v3 = KiProcessorIndexToNumberMappingTable[CurrentPrcb->Number];
  v4 = KeCountSetBitsAffinityEx(&Dest.Count);
  if( ((Dest.Bitmap[v3 >> 6] >> (v3 & 0x3F)) & 1) != 0 )
    --v4;
  KiForceIdlePendingDpcCount = v4;
  ProcIndex_8.CurrentMask = Dest.Bitmap[0];
  ProcIndex_8.Affinity = &Dest;
  while( 1 )
  {
    KeEnumerateNextProcessor(&ProcIndex, &ProcIndex_8);
    if( result )
      break;
    Prcb = KeGetPrcb((unsigned int)ProcIndex);
    if( Prcb == KeGetCurrentPrcb() )
      KiForceIdleParkUnparkProcessor(Prcb, (INT8)v1);
    else
      KiInsertQueueDpc(&Prcb->ForceIdleDpc, v1, 0i64, 0i64, 0);
  }
  return result;
}

Referenced by:

KiForceIdleStartDpcRoutine
KiForceIdleStopDpcRoutine