MiFindEmptyAddressRangeInTree

VOID __fastcall MiFindEmptyAddressRangeInTree(
        _RTL_AVL_TREE *Table,
        UINT64 SizeOfRange,
        UINT64 Alignment,
        VOID *MinimumAddress){
  UINT64 v4; 
  unsigned __int64 v5; 
  unsigned __int64 v6; 
  UINT64 v8; 
  unsigned __int64 v9; 
  unsigned __int64 v10; 
  unsigned __int64 v11; 
  _RTL_BALANCED_NODE *Root; 
  unsigned __int64 i; 
  unsigned __int64 v14; 
  unsigned __int64 v15; 
  _QWORD **v16; 
  unsigned __int64 v17; 
  _QWORD *v18; 
  UINT64 v19; 
  unsigned __int64 v20; 
  unsigned __int64 v21; 
  unsigned __int64 v22; 
  UINT64 v23; 
  unsigned __int64 v24; 
  unsigned __int64 v25; 
  unsigned __int64 v26; 
  _QWORD *v27; 

  v4 = Alignment >> 12;
  v5 = (SizeOfRange + 4095) >> 12;
  v6 = (unsigned __int64)MinimumAddress >> 12;
  v8 = ~((Alignment >> 12) - 1);
  v9 = v8 & ((Alignment >> 12) + (v25 >> 12) - 1);
  if( (unsigned __int64)MinimumAddress >> 12 )
  {
    LODWORD(v10) = MiHonorRangeStraddleRequirement(v9, (SizeOfRange + 4095) >> 12, v6, 0i64);
    v9 = v10;
  }
  v11 = v26 >> 12;
  if( v9 > v26 >> 12 || v5 > v11 - v9 + 1 )
    return;
  Root = Table->Root;
  if( !Table->Root )
    goto LABEL_33;
  do
  {
    i = (unsigned __int64)Root;
    Root = Root->Children[0];
  }
  while( Root );
  v14 = i;
  v15 = *(unsigned int *)(i + 24) | ((unsigned __int64)*(unsigned __int8 *)(i + 32) << 32);
  if( v15 > v9 && v5 <= v15 - v9 )
    goto LABEL_33;
  while( 1 )
  {
    v16 = *(_QWORD ***)(i + 8);
    v17 = i;
    if( v16 )
    {
      v18 = *v16;
      for( i = *(_QWORD *)(i + 8); v18; v18 = (_QWORD *)*v18 )
        i = (unsigned __int64)v18;
    }
    else
    {
      while( 1 )
      {
        i = *(_QWORD *)(i + 16) & 0xFFFFFFFFFFFFFFFCui64;
        if( !i || *(_QWORD *)i == v17 )
          break;
        v17 = i;
      }
    }
    v19 = v4 + (*(unsigned int *)(v14 + 28) | ((unsigned __int64)*(unsigned __int8 *)(v14 + 33) << 32));
    if( !i )
      break;
    if( (v8 & (v19 - 1)) < v9 )
    {
      if( (*(unsigned int *)(i + 24) | ((unsigned __int64)*(unsigned __int8 *)(i + 32) << 32)) <= v9 )
        goto LABEL_21;
      v20 = v9;
    }
    else
    {
      v20 = v8 & v19;
    }
    if( v6 )
    {
      LODWORD(v21) = MiHonorRangeStraddleRequirement(v20, v5, v6, 0i64);
      v20 = v21;
    }
    if( v20 > v11 )
      return;
    v22 = *(unsigned int *)(i + 24) | ((unsigned __int64)*(unsigned __int8 *)(i + 32) << 32);
    if( v22 > v20 && v5 <= v22 - v20 && v5 <= v11 - v20 + 1 )
    {
      *v27 = v20 << 12;
      return;
    }
LABEL_21:
    v14 = i;
  }
  v23 = v8 & v19;
  if( v23 >= v9 )
    v9 = v23;
  if( v6 )
  {
    LODWORD(v24) = MiHonorRangeStraddleRequirement(v9, v5, v6, 0i64);
    v9 = v24;
  }
  if( v11 >= v9 && v5 <= v11 - v9 + 1 )
LABEL_33:
    *v27 = v9 << 12;
}

Referenced by:

MiFindEmptyAddressRange