PpmCheckInitProcessors

VOID __stdcall PpmCheckInitProcessors(INT64 ecx0){
  int v1; 
  int v2; 
  _KPRCB *Prcb; 
  int v4; 
  _KPRCB *v5; 
  unsigned int v6; 
  UINT64 a5; 
  UINT64 ProcIndex; 
  _KAFFINITY_ENUMERATION_CONTEXT Context; 
  _KAFFINITY_ENUMERATION_CONTEXT v10; 
  _KAFFINITY_EX Result; 
  _KAFFINITY_EX Affinity; 

  v1 = ecx0;
  memset(&Affinity, 0i64, sizeof(Affinity));
  *(_DWORD *)(&Context.CurrentIndex + 1) = 0;
  *(&Context.CurrentIndex + 3) = 0;
  memset(&Result, 0i64, sizeof(Result));
  a5 = 0i64;
  if( v1 )
  {
    *(_DWORD *)&Result.Count = 1310721;
    memset(&Result.Reserved, 0i64, 0xA4u);
  }
  else
  {
    PpmAcquireLock((_PPM_LOCK *)((char *)&stru_140C23628 + 1048));
    KeQueryActiveProcessorAffinity((INT64)&Affinity);
    if( !(unsigned __int8)KeSubtractAffinityEx(&Affinity.Count, (INT8 *)&PpmCheckRegistered, (INT8 *)&Result) )
    {
      PpmReleaseLock((INT64 *)&stru_140C23628 + 131);
      return;
    }
  }
  KeOrAffinityEx((INT8 *)&PpmCheckRegistered, &Result.Count, (INT8 *)&PpmCheckRegistered);
  if( !KeIsEmptyAffinityEx(&Result.Count) )
  {
    Context.CurrentMask = Result.Bitmap[0];
    Context.Affinity = &Result;
    Context.CurrentIndex = 0;
    while( 1 )
    {
      KeEnumerateNextProcessor((UINT64 *)((char *)&a5 + 4), &Context);
      if( v2 )
        break;
      Prcb = KeGetPrcb(HIDWORD(a5));
      PpmAllocatePerfCheck((_KPRCB *)&Prcb->PowerState.CheckContext);
    }
    PopExecuteOnTargetProcessors(
      &Result,
      (INT64 *)PpmCheckProcessorInit,
      0i64,
      0i64,
      a5,
      ProcIndex,
      (UINT64)Context.Affinity);
  }
  PpmParkRegisterParking();
  if( (KeGetCurrentPrcb()->FeatureBits & 0x8000000000i64) != 0 )
  {
    *(&stru_140C23628 + 882) |= 0x400u;
    LODWORD(a5) = a5 | 0x400;
    PpmUpdateProcessorPolicy((_PPM_POLICY_ACTION_MASK *)&a5);
  }
  PpmCheckReInit();
  PpmCheckApplyParkConstraints();
  *(_DWORD *)(&v10.CurrentIndex + 1) = 0;
  *(&v10.CurrentIndex + 3) = 0;
  LODWORD(ProcIndex) = 0;
  if( KeGetCurrentPrcb()->PowerState.Hypervisor == ProcHypervisorPresent
    && HvlIsRootPowerSchedulerQosPresent()
    && !PpmPerfVmQosSupported )
  {
    PpmAcquireLock((_PPM_LOCK *)((char *)&stru_140C23628 + 1048));
    v10.CurrentMask = PpmCheckRegistered.Bitmap[0];
    v10.CurrentIndex = 0;
    v10.Affinity = &PpmCheckRegistered;
    while( 1 )
    {
      KeEnumerateNextProcessor(&ProcIndex, &v10);
      if( v4 )
        break;
      v5 = KeGetPrcb((unsigned int)ProcIndex);
      v6 = PpmPerfQosTransitionHysteresisOverride;
      if( PpmPerfQosTransitionHysteresisOverride == -1 )
        v6 = PpmPerfQosTransitionHysteresis;
      v5->PowerState.QosTransitionHysteresis = PpmConvertTime(v6, 0xF4240ui64, 1000000i64 * v5->MHz);
    }
    PpmPerfQosManageIdleProcessors = 0;
    PpmPerfVmQosSupported = 1;
    PpmReinitializeHeteroEngine(1);
  }
}

Referenced by:

PoInitSystem
PopNewProcessorCallback
PpmReapplyPerfPolicy