MiFindEmptyAddressRangeDown

__int64 __fastcall MiFindEmptyAddressRangeDown(
        __int64 a1,
        unsigned __int64 a2,
        unsigned __int64 a3,
        unsigned __int64 a4,
        unsigned __int64 a5,
        unsigned __int64 a6,
        char a7,
        unsigned __int64 *a8){
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  __int64 v15; 
  int v16; 
  __int64 v17; 
  int EmptyAddressRangeDownTree; 
  int v19; 
  unsigned __int64 v21; 
  __int64 v22; 
  __int64 v23; 
  if( a6 - a5 + 1 < a2 )
    return 3221225495i64;
  v12 = a6 + 1;
  v13 = *(_QWORD *)(a1 + 56);
  v14 = a6 + 1;
  v15 = *((_QWORD *)KeGetCurrentThread() + 23);
  v23 = v15;
  if( a6 + 1 > *(_QWORD *)(a1 + 48) )
    v14 = *(_QWORD *)(a1 + 48);
  v16 = *(_DWORD *)(a1 + 64);
  v17 = (unsigned __int8)v16;
  if( !(_BYTE)v16 )
    v17 = 1i64;
  v22 = v17;
  if( v13 < a5 )
    v13 = a5;
  while( 1 )
  {
    if( v13 >= a6 || a6 - v13 + 1 < a2 )
    {
      v19 = -1073741801;
    }
    else
    {
      EmptyAddressRangeDownTree = MiFindEmptyAddressRangeDownTree((__int64 *)(v15 + 2008), a2, a3, a4, v13, v14, a8);
      v17 = v22;
      v19 = EmptyAddressRangeDownTree;
    }
    if( v19 >= 0 )
      break;
    if( v14 == v12 || (a7 & 2) != 0 )
    {
      v21 = v17 << 16;
      if( (a7 & 2) == 0 )
        v21 = 0x10000i64;
      if( v21 < a5 )
        v21 = a5;
      if( v21 >= v13 )
        return(unsigned int)v19;
      v15 = v23;
      v13 = v21;
    }
    else
    {
      v15 = v23;
      v14 = a6 + 1;
    }
  }
  return(unsigned int)v19;
}

Referenced by:

MiSelectUserAddress