KiAddProcessorToGroupDatabase

VOID __stdcall KiAddProcessorToGroupDatabase(_KPRCB *Prcb, UINT64 DynamicProcessor){
  _KNODE *ParentNode; 
  int v3; 
  __int64 *v5; 
  unsigned __int64 v6; 
  __int64 v7; 
  unsigned __int8 v8; 
  __int64 Number; 
  __int64 v10; 
  unsigned __int64 *p_PreferredMask; 
  __int64 v12; 
  bool v13; 

  ParentNode = Prcb->ParentNode;
  v3 = DynamicProcessor;
  v5 = &KiGroupBlock[2 * ParentNode->Affinity.Group];
  v6 = *v5 + 1;
  _BitScanReverse64((unsigned __int64 *)&v7, v6);
  Prcb->GroupSetMember = v6;
  v8 = ParentNode->AffinityFill[8];
  Prcb->GroupIndex = v7;
  Prcb->Group = v8;
  *v5 |= v6;
  if( KeForceGroupAwareness )
  {
    v13 = Prcb->Number <= 0xFF;
    Prcb->LegacyNumber = Prcb->Number;
    if( !v13 )
      Prcb->LegacyNumber = -1;
  }
  else if( Prcb->Group )
  {
    Prcb->LegacyNumber = (unsigned int)v7 % (unsigned int)KeQueryActiveProcessorCountEx(0);
  }
  else
  {
    Prcb->LegacyNumber = v7;
  }
  Number = Prcb->Number;
  v10 = (unsigned int)v7 + (Prcb->Group << 6);
  KiProcessorIndexToNumberMappingTable[Number] = v10;
  KiProcessorNumberToIndexMappingTable[v10] = Number;
  p_PreferredMask = &ParentNode->HeteroSets[0].PreferredMask;
  v12 = 5i64;
  do
  {
    if( !v3 )
    {
      *(p_PreferredMask - 1) |= v6;
      *p_PreferredMask |= v6;
    }
    p_PreferredMask[1] |= v6;
    p_PreferredMask += 3;
    --v12;
  }
  while( v12 );
}

Referenced by:

KiConfigureInitialNodes
KxInitializeProcessorState