MiFreePartitionTree

__int64 __fastcall MiFreePartitionTree(unsigned __int64 a1, unsigned __int64 *a2, char a3, int a4){
  unsigned __int64 v4; 
  bool v5; 
  int v6; 
  _QWORD *v11; 
  _QWORD *v12; 
  v4 = *a2;
  v5 = 0;
  v6 = 0;
  while( 1 )
  {
    if( !v4 )
      return(unsigned int)v6;
    RtlAvlRemoveNode(a2, (__int64 *)v4);
    if( a4 == 1 )
    {
      v6 = MiFreePartitionNodePages(a1, v4, a3);
      if( v6 < 0 )
        break;
    }
    ExFreePoolWithTag(*(PVOID *)(v4 + 40), 0);
    ExFreePoolWithTag((PVOID)v4, 0);
    v4 = *a2;
  }
  v11 = (_QWORD *)*a2;
  if( !*a2 )
    goto LABEL_11;
  while( (*(_QWORD *)(v4 + 24) & 0x7FFFFFFFFFFFFFFFui64) < (v11[3] & 0x7FFFFFFFFFFFFFFFui64) )
  {
    v12 = (_QWORD *)*v11;
    if( !*v11 )
      goto LABEL_11;
LABEL_14:
    v11 = v12;
  }
  v12 = (_QWORD *)v11[1];
  if( v12 )
    goto LABEL_14;
  v5 = 1;
LABEL_11:
  RtlAvlInsertNodeEx(a2, (__int64)v11, v5, (_QWORD *)v4);
  return(unsigned int)v6;
}

Referenced by:

MiAllocatePartitionPhysicalPages
MiClearPartitionPageBitMap
MiHotAddPartitionMemory
MiInsertPartitionPages