MxComputeFreeNodeDescriptorRequirements

VOID __stdcall MxComputeFreeNodeDescriptorRequirements(_LOADER_PARAMETER_BLOCK *LoaderBlock, UINT64 *RequiredPages){
  __int64 v4; 
  UINT64 v5; 
  UINT64 v6; 
  _LIST_ENTRY *Flink; 
  unsigned __int64 Flink_low; 
  __int64 v9; 
  UINT64 v10; 
  UINT64 Blink; 
  __int64 v12; 
  __int64 v13; 
  __int64 v14; 
  __int64 v15; 
  _LIST_ENTRY *p_MemoryDescriptorListHead; 

  memset(RequiredPages, 0i64, 0x200u);
  v4 = 0xFFFFFFFFi64;
  v5 = -1i64;
  v6 = -1i64;
  Flink = LoaderBlock->MemoryDescriptorListHead.Flink;
  p_MemoryDescriptorListHead = &LoaderBlock->MemoryDescriptorListHead;
  if( Flink != &LoaderBlock->MemoryDescriptorListHead )
  {
    while( 1 )
    {
      Flink_low = SLODWORD(Flink[1].Flink);
      if( (unsigned int)Flink_low > 0x28 || (v9 = 0x1C5C0C00048i64, !_bittest64(&v9, Flink_low)) )
      {
        v10 = (UINT64)Flink[2].Flink;
        Blink = (UINT64)Flink[1].Blink;
        if( v10 )
          break;
      }
LABEL_9:
      Flink = Flink->Flink;
      if( Flink == p_MemoryDescriptorListHead )
        goto LABEL_10;
    }
    while( 1 )
    {
      MiRestrictRangeToNode(Blink, v10);
      v15 = v12;
      LODWORD(v13) = MiSearchNumaNodeTable((PVOID)Blink);
      v14 = *(unsigned int *)(v13 + 8);
      if( v6 != -1i64 )
      {
        if( (_DWORD)v14 == (_DWORD)v4
          && (char *)&MmGetPdeBase()[1] + (((48 * v6) >> 18) & 0x3FFFFFF8) >= (char *)MmGetPdeBase()
                                                                            + (((48 * Blink) >> 18) & 0x3FFFFFF8) )
        {
          goto LABEL_8;
        }
        RequiredPages[(unsigned int)v4] += MxComputePfnPagesNeeded(v5, v6);
      }
      v5 = Blink;
LABEL_8:
      v4 = v14;
      v6 = v15 + Blink;
      Blink += v15;
      v10 -= v15;
      if( !v10 )
        goto LABEL_9;
    }
  }
LABEL_10:
  RequiredPages[v4] += MxComputePfnPagesNeeded(v5, v6);
}

Referenced by:

MiFindLargestLoaderDescriptor