MiCreateNodeLists

PHYSICAL_MEMORY_DESCRIPTOR *__stdcall MiCreateNodeLists(
        _MI_PARTITION *Partition,
        PHYSICAL_MEMORY_DESCRIPTOR *PhysicalMemoryBlock){
  unsigned int v2; 
  int v5; 
  PHYSICAL_MEMORY_DESCRIPTOR *v6; 
  char *Pool; 
  __int64 v8; 
  __int64 v9; 
  __int64 v10; 
  __int64 v11; 
  __int64 v12; 
  void *v14; 
  __int64 v15; 
  _QWORD ListHead[2]; 
  __int64 v17; 

  v2 = 0;
  ListHead[1] = ListHead;
  v17 = 0i64;
  ListHead[0] = ListHead;
  v5 = 0;
  v6 = 0i64;
  while( MiDescribePageRun(
            (_MI_MEMORY_NODE_LISTHEAD *)ListHead,
            PhysicalMemoryBlock->Run[v5].BasePage,
            PhysicalMemoryBlock->Run[v5].PageCount) )
  {
    if( ++v5 == PhysicalMemoryBlock->NumberOfRuns )
    {
      Pool = (char *)MiAllocatePool(64i64, 24 * v17 + 32, 0x6C4D6D4Dui64);
      if( Pool )
      {
        v6 = (PHYSICAL_MEMORY_DESCRIPTOR *)(Pool + 16);
        *((_QWORD *)Pool + 1) = 1i64;
        *(_QWORD *)Pool = Partition;
        *((_DWORD *)Pool + 4) = v17;
        v8 = (__int64)&Pool[16 * *((unsigned int *)Pool + 4) + 32];
        *((_QWORD *)Pool + 3) = PhysicalMemoryBlock->NumberOfPages;
        while( 1 )
        {
          v9 = ListHead[0];
          if( (_QWORD *)ListHead[0] == ListHead )
            return v6;
          if( *(_QWORD **)(ListHead[0] + 8i64) != ListHead )
            goto LABEL_11;
          v10 = *(_QWORD *)ListHead[0];
          if( *(_QWORD *)(*(_QWORD *)ListHead[0] + 8i64) != ListHead[0] )
            goto LABEL_11;
          ListHead[0] = *(_QWORD *)ListHead[0];
          *(_QWORD *)(v10 + 8) = ListHead;
          v11 = v2;
          v12 = v2++;
          v12 *= 2i64;
          *(&v6->Run[0].BasePage + v12) = *(_QWORD *)(v9 + 16);
          *(&v6->Run[0].PageCount + v12) = *(_QWORD *)(v9 + 24);
          *(_DWORD *)(v8 + 8 * v11) = *(_DWORD *)(v9 + 32);
          *(_DWORD *)(v8 + 8 * v11 + 4) = *(_DWORD *)(v9 + 36);
          ExFreePoolWithTag((PVOID)v9, 0);
        }
      }
      break;
    }
  }
  while( 1 )
  {
    v14 = (void *)ListHead[0];
    if( (_QWORD *)ListHead[0] == ListHead )
      break;
    if( *(_QWORD **)(ListHead[0] + 8i64) != ListHead
      || (v15 = *(_QWORD *)ListHead[0], *(_QWORD *)(*(_QWORD *)ListHead[0] + 8i64) != ListHead[0]) )
    {
LABEL_11:
      __fastfail(3u);
    }
    ListHead[0] = *(_QWORD *)ListHead[0];
    *(_QWORD *)(v15 + 8) = ListHead;
    ExFreePoolWithTag(v14, 0);
  }
  return v6;
}

Referenced by:

MiInitNucleus
MiMakePartitionMemoryBlock