KiForceIdleUpdateSchedulerParkState

INT64 __fastcall KiForceIdleUpdateSchedulerParkState(UINT8 a1){
  void *v1; 
  struct _KPRCB *CurrentPrcb; 
  unsigned int v3; 
  int v4; 
  INT64 v5; 
  __int64 v6; 
  _DEVICE_MAP **v7; 
  unsigned int ProcessorNumber; 
  __int128 ProcessorNumber_8; 
  __int64 v10; 
  _KAFFINITY_EX result; 
  v1 = (void *)a1;
  v10 = 0i64;
  ProcessorNumber_8 = 0i64;
  memset((INT64)&result, 0i64);
  ProcessorNumber = 0;
  CurrentPrcb = KeGetCurrentPrcb();
  while( KiForceIdlePendingDpcCount )
    _mm_pause();
  if( (_BYTE)v1 )
  {
    KeCopyAffinityEx((__int64)&result, &KeActiveProcessors.Count);
  }
  else
  {
    KeCopyAffinityEx((__int64)&result, (unsigned __int16 *)&KiForceIdleUnparkRestoreMask);
    KeOrAffinityEx(&result, &KiForceIdleSoftParkRestoreMask, &result);
  }
  v3 = KiProcessorIndexToNumberMappingTable[*((unsigned int *)CurrentPrcb + 9)];
  v4 = KeCountSetBitsAffinityEx(&result);
  if( ((result.Bitmap[v3 >> 6] >> (v3 & 0x3F)) & 1) != 0 )
    --v4;
  KiForceIdlePendingDpcCount = v4;
  *((_QWORD *)&ProcessorNumber_8 + 1) = result.Bitmap[0];
  *(_QWORD *)&ProcessorNumber_8 = &result;
  while( 1 )
  {
    v5 = KeEnumerateNextProcessor(&ProcessorNumber, (unsigned __int16 **)&ProcessorNumber_8);
    if( (_DWORD)v5 )
      break;
    KeGetPrcb(ProcessorNumber);
    if( (struct _KPRCB *)v6 == KeGetCurrentPrcb() )
    {
      LOBYTE(v7) = (_BYTE)v1;
      KiForceIdleParkUnparkProcessor((VOID *)v6, v7);
    }
    else
    {
      KiInsertQueueDpc((_KDPC *)(v6 + 33304), v1, 0i64, 0i64, 0);
    }
  }
  return v5;
}

Referenced by:

KiForceIdleStartDpcRoutine
KiForceIdleStopDpcRoutine