KiQueryProcessorNode

VOID __fastcall KiQueryProcessorNode(UINT64 ProcIndex, UINT64 *Identifier, UINT16 *Node){
  unsigned int v3; 
  __int64 v6; 
  NTSTATUS ProcessorNode; 
  NTSTATUS FirstAvailableNode; 
  UINT64 v9; 
  _HVLP_LPCB *LpcbByLpIndex; 
  unsigned int v11; 

  v3 = ProcIndex;
  if( (unsigned int)ProcIndex < (unsigned int)KeNumberProcessors_0 )
  {
    _mm_lfence();
    *Node = (*(&KiProcessorBlock + (unsigned int)ProcIndex))->ParentNode->Affinity.Reserved[0];
    return;
  }
  v6 = *Node;
  if( !KiNumaQueryProcessorNode )
  {
    if( (unsigned int)ProcIndex >= KiMaximumGroupSize )
      return;
    *Node = 0;
    goto LABEL_17;
  }
  ProcessorNode = KiNumaQueryProcessorNode((unsigned int)ProcIndex);
  FirstAvailableNode = ProcessorNode;
  if( ProcessorNode )
  {
    if( ProcessorNode != -1073741275 )
      goto LABEL_6;
    if( (_WORD)v6 == 0xFFFF || KiIsNodeFull((_KNODE *)KeNodeBlock[v6]) )
      return;
    *Node = v6;
LABEL_17:
    FirstAvailableNode = 0;
LABEL_6:
    if( FirstAvailableNode )
      return;
    goto LABEL_7;
  }
  if( *Node == 0xFFFF )
  {
    FirstAvailableNode = KiFindFirstAvailableNode(Node);
    goto LABEL_6;
  }
LABEL_7:
  v9 = *(unsigned int *)Identifier;
  if( (_DWORD)v9 == -1 )
  {
    *(_DWORD *)Identifier = -1;
    v9 = 0xFFFFFFFFi64;
    if( (HvlpFlags & 2) != 0 )
    {
      LpcbByLpIndex = HvlpGetLpcbByLpIndex(v3);
      v9 = v11;
      if( LpcbByLpIndex )
      {
        v9 = (unsigned int)LpcbByLpIndex[2];
        *(_DWORD *)Identifier = v9;
      }
    }
  }
  if( (HvlpFlags & 2) != 0 )
    HvlpGetLpcbByApicId(v9);
}

Referenced by:

KeStartAllProcessors
KiStartDynamicProcessor