MxSwitchDescriptors

_MX_ALLOCATION_DESCRIPTOR *__stdcall MxSwitchDescriptors(UINT64 PreferredNode){
  _LOADER_PARAMETER_BLOCK *v1; 
  unsigned __int64 v2; 
  _LIST_ENTRY *p_MemoryDescriptorListHead; 
  __int64 *v4; 
  _LIST_ENTRY *Blink; 
  int Flink; 
  unsigned int v7; 
  __int64 *v8; 
  __int64 v9; 
  __int64 v10; 
  __int64 v11; 
  _MX_ALLOCATION_DESCRIPTOR *result; 

  v1 = KeLoaderBlock_0;
  v2 = (unsigned int)PreferredNode;
  p_MemoryDescriptorListHead = &KeLoaderBlock_0->MemoryDescriptorListHead;
  v4 = &qword_140D5AD60[5 * (unsigned int)PreferredNode];
  Blink = (_LIST_ENTRY *)v4[4];
  while( 2 )
  {
    if( !Blink )
    {
      Blink = v1->MemoryDescriptorListHead.Blink;
      goto LABEL_14;
    }
    while( 1 )
    {
      Blink = Blink->Blink;
LABEL_14:
      if( Blink == p_MemoryDescriptorListHead )
        break;
      Flink = (int)Blink[1].Flink;
      if( Flink == 2 || Flink == 24 )
      {
        v7 = 0;
        if( KeNumberNodes )
        {
          v8 = qword_140D5A380;
          do
          {
            if( Blink == (_LIST_ENTRY *)*v8 )
              break;
            ++v7;
            v8 += 5;
          }
          while( v7 < (unsigned __int16)KeNumberNodes );
        }
        if( v7 >= (unsigned __int16)KeNumberNodes )
        {
          LODWORD(v9) = MiSearchNumaNodeTable(Blink[1].Blink);
          if( *(_DWORD *)(v9 + 8) == (_DWORD)v2 || (v10 = MxBootDescriptorAnyNode, _bittest64(&v10, v2)) )
          {
            MiInitializeBootMemoryDescriptor(
              (_MX_ALLOCATION_DESCRIPTOR *)v4,
              (_MEMORY_ALLOCATION_DESCRIPTOR *)Blink,
              (UINT64)Blink[1].Blink,
              (UINT64)Blink[2].Flink);
            LODWORD(Blink[1].Flink) |= 0x40000000u;
            result = (_MX_ALLOCATION_DESCRIPTOR *)v4;
            MxFreeDescriptor[v2] = (__int64)v4;
            return result;
          }
        }
      }
    }
    v11 = MxBootDescriptorAnyNode;
    if( !_bittest64(&v11, v2) )
    {
      v4[4] = 0i64;
      MxBootDescriptorAnyNode = v11 | (1i64 << v2);
      Blink = 0i64;
      continue;
    }
    return 0i64;
  }
}

Referenced by:

MxGetNextPage