KiQueryProcessorNode

NTSTATUS __stdcall KiQueryProcessorNode(UINT64 ProcIndex, UINT64 *Identifier, UINT16 *Node){
  unsigned int v3; 
  __int64 v6; 
  NTSTATUS ProcessorNode; 
  NTSTATUS FirstAvailableNode; 
  int v9; 
  WCHAR *LpcbByLpIndex; 
  int v12; 
  WCHAR *LpcbByApicId; 
  v3 = ProcIndex;
  if( (unsigned int)ProcIndex >= (unsigned int)KeNumberProcessors_0 )
  {
    v6 = *Node;
    if( KiNumaQueryProcessorNode )
    {
      ProcessorNode = KiNumaQueryProcessorNode((unsigned int)ProcIndex);
      FirstAvailableNode = ProcessorNode;
      if( !ProcessorNode )
      {
        if( *Node != 0xFFFF )
        {
LABEL_7:
          v9 = *(_DWORD *)Identifier;
          if( (*(_BYTE *)(*((_QWORD *)&KeNodeBlock + *Node) + 181i64) & 2) == 0 )
            FirstAvailableNode = -1073741275;
          if( v9 == -1 )
          {
            *(_DWORD *)Identifier = -1;
            v9 = -1;
            if( (HvlpFlags & 2) != 0 )
            {
              LpcbByLpIndex = HvlpGetLpcbByLpIndex(v3);
              v9 = v12;
              if( LpcbByLpIndex )
              {
                v9 = *((_DWORD *)LpcbByLpIndex + 2);
                *(_DWORD *)Identifier = v9;
              }
            }
          }
          if( (HvlpFlags & 2) == 0 )
            return FirstAvailableNode;
          LpcbByApicId = HvlpGetLpcbByApicId(v9);
          if( LpcbByApicId )
          {
            if( *((_DWORD *)LpcbByApicId + 12) )
              return FirstAvailableNode;
          }
          return -1073741275;
        }
        FirstAvailableNode = KiFindFirstAvailableNode(Node);
LABEL_6:
        if( FirstAvailableNode )
          return FirstAvailableNode;
        goto LABEL_7;
      }
      if( ProcessorNode != -1073741275 )
        goto LABEL_6;
      if( (_WORD)v6 == 0xFFFF || KiIsNodeFull(*((_QWORD *)&KeNodeBlock + v6)) )
        return FirstAvailableNode;
      *Node = v6;
    }
    else
    {
      if( (unsigned int)ProcIndex >= KiMaximumGroupSize )
        return -1073741275;
      *Node = 0;
    }
    FirstAvailableNode = 0;
    goto LABEL_6;
  }
  _mm_lfence();
  *Node = *(_WORD *)(*((_QWORD *)*(&KiProcessorBlock + (unsigned int)ProcIndex) + 24) + 146i64);
  return 0;
}

Referenced by:

KeStartAllProcessors
KiStartDynamicProcessor