MiFindEmptyAddressRange

NTSTATUS __stdcall MiFindEmptyAddressRange(
        UINT64 SizeOfRange,
        UINT64 Alignment,
        PVOID HighestVadAddress,
        UINT64 ProtectionMask,
        UINT64 InternalFlags,
        PVOID *Base,
        UINT64 *HINTHonored){
  PVOID *v7; 
  VOID *v8; 
  char *v10; 
  int v13; 
  _DWORD *v14; 
  _EPROCESS *Process; 
  unsigned __int64 v16; 
  unsigned __int64 v17; 
  UINT64 v18; 
  UINT64 v19; 
  UINT64 v20; 
  __int64 v21; 
  UINT64 ClearBits; 
  UINT64 v23; 
  NTSTATUS result; 
  unsigned __int64 HighestUserAddress; 
  unsigned __int64 v26; 
  unsigned __int64 v27; 
  PVOID *v28; 
  UINT64 v29; 
  UINT64 v30; 
  bool v31; 
  _RTL_AVL_TREE *p_VadRoot; 
  __int64 v33; 
  UINT64 v34; 
  _EPROCESS *v35; 
  UINT64 InternalFlagsa; 
  unsigned __int64 Basea; 
  _QWORD *v40; 
  _DWORD *v41; 

  v7 = Base;
  v8 = (VOID *)ProtectionMask;
  v10 = (char *)HighestVadAddress;
  if( (unsigned __int64)Base - InternalFlags + 1 < Alignment )
    return -1073741801;
  v13 = 1;
  v14 = v41;
  Process = KeGetCurrentThread()->ApcState.Process;
  v35 = Process;
  *v41 = 1;
  if( ((unsigned __int8)HINTHonored & 2) != 0 )
  {
    HighestUserAddress = (unsigned __int64)Process->HighestUserAddress;
    v16 = (unsigned __int8)*(_DWORD *)(SizeOfRange + 64);
    v17 = *(_QWORD *)(SizeOfRange + 48) >> 16;
    InternalFlagsa = v17;
    Basea = v16;
    if( HighestUserAddress > 0x100000000i64 )
    {
      v17 = (HighestUserAddress >> 16) - (unsigned __int8)v17 - 1;
      InternalFlagsa = v17;
    }
    Process = v35;
    if( !(unsigned __int8)*(_DWORD *)(SizeOfRange + 64) )
    {
      v16 = 1i64;
      Basea = 1i64;
    }
  }
  else
  {
    v16 = 0i64;
    v13 = 0;
    v17 = 0i64;
    Basea = 0i64;
    InternalFlagsa = 0i64;
  }
  if( !ProtectionMask )
  {
    if( v10 == (char *)0x10000 )
    {
      v18 = Alignment + 0xFFFF;
    }
    else
    {
      if( (unsigned __int64)(v10 - 0x200000) > 0x7FE00000 || ((unsigned __int64)(v10 - 1) & Alignment) != 0 )
        goto LABEL_35;
      v18 = Alignment;
    }
    v19 = v18 >> 16;
    if( !InternalFlags && (unsigned __int64)v7 >= (*(_QWORD *)(SizeOfRange + 40) << 16) + 0xFFFFi64 )
    {
      while( 1 )
      {
        v20 = *(_QWORD *)(SizeOfRange + 16);
        if( v19 != 1 && v19 >= *(_QWORD *)(SizeOfRange + 24) )
          v20 = *(_QWORD *)(SizeOfRange + 32);
        v21 = *(_QWORD *)(SizeOfRange + 8) - *(&stru_140C4DB30 + 174);
        if( v13 == 1 )
        {
          v26 = v20 + 8 * v21;
          if( v26 < v16 || v26 >= v17 )
          {
            v20 = v16;
            *v14 = 0;
          }
        }
        if( v10 == (char *)0x10000 )
          ClearBits = RtlFindClearBitsEx((_RTL_BITMAP_EX *)SizeOfRange, v19, v20);
        else
          LODWORD(ClearBits) = MiFindClearVadBitsAligned((_RTL_BITMAP *)SizeOfRange, (UINT64)v10, v19, v20);
        v23 = ClearBits;
        if( ClearBits != -1i64 )
        {
          if( v13 != 1 || (v27 = ClearBits + 8 * v21, v27 >= Basea) && v27 < InternalFlagsa )
          {
            *v40 = (v23 + 8i64 * (*(_QWORD *)(SizeOfRange + 8) - *(&stru_140C4DB30 + 174))) << 16;
            return 0;
          }
        }
        if( MiExpandVadBitMap((_MI_VAD_ALLOCATION_CELL *)SizeOfRange, v19) != 1 )
          break;
        v10 = (char *)HighestVadAddress;
        v14 = v41;
        v17 = InternalFlagsa;
        v16 = Basea;
      }
      if( v13 == 1 )
        return -1073741801;
      v10 = (char *)HighestVadAddress;
      v14 = v41;
      v17 = InternalFlagsa;
      v16 = Basea;
      Process = v35;
    }
    v8 = (VOID *)ProtectionMask;
  }
LABEL_35:
  *v14 = 0;
  if( v13 == 1 )
  {
    v28 = (PVOID *)(v17 << 16);
    if( v7 > v28 )
      v7 = v28;
  }
  v29 = *(_QWORD *)(SizeOfRange + 56);
  v30 = InternalFlags;
  if( v29 > InternalFlags )
    v30 = v29;
  v31 = v30 < (unsigned __int64)v7;
  if( v30 > (unsigned __int64)v7 )
  {
    if( (Process->MitigationFlags & 0x20) == 0 || (v33 = 0x3FFFFFFFi64, (unsigned __int64)v7 <= 0x3FFFFFFF) )
      v33 = 0xFFFFFFi64;
    v30 &= v33;
    if( !v30 || v30 > (unsigned __int64)v7 )
      v30 = 0x10000i64;
    if( v13 == 1 && v30 < v29 )
      v30 = v16 << 16;
    if( v30 < InternalFlags )
      v30 = InternalFlags;
    v31 = v30 < (unsigned __int64)v7;
  }
  if( !v31 || (unsigned __int64)v7 - v30 + 1 < Alignment )
    return -1073741801;
  p_VadRoot = &Process->VadRoot;
  MiFindEmptyAddressRangeInTree(&Process->VadRoot, Alignment, (UINT64)v10, v8);
  if( result < 0 )
  {
    v34 = Basea << 16;
    if( v13 != 1 )
      v34 = 0x10000i64;
    if( v34 < InternalFlags )
      v34 = InternalFlags;
    if( v34 < v30 )
      MiFindEmptyAddressRangeInTree(p_VadRoot, Alignment, (UINT64)HighestVadAddress, v8);
  }
  return result;
}

Referenced by:

MiSelectUserAddress