MiAllocateEnclaveVad

__int64 __fastcall MiAllocateEnclaveVad(int a1, UINT64 a2, unsigned __int64 a3, INT64 a4, _QWORD *a5){
  unsigned __int64 v5; 
  _ETHREAD *CurrentThread; 
  _BOOL4 v9; 
  _EPROCESS *Process; 
  UINT64 ProtectionMask; 
  _DWORD *Pool; 
  _DWORD *v13; 
  _MMPTE *v15; 
  VOID *v16; 
  NTSTATUS inserted; 
  _KTBFLUSH_TYPE v18; 
  void *v19; 
  int v20; 
  UINT64 v21; 
  UINT64 v22; 
  int v23; 
  unsigned __int64 v24; 
  UINT64 v25; 
  _EPROCESS *v26; 
  UINT64 *HINTHonored; 
  PVOID *v28; 

  v5 = a3;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v9 = (unsigned int)(a1 - 16) <= 1;
  Process = CurrentThread->Tcb.ApcState.Process;
  if( a2 >= 0xFFFFFFFFFFFFF000ui64 || a2 == 0 )
    return 3221225485i64;
  if( (unsigned int)(a1 - 16) > 1 )
  {
    ProtectionMask = a2;
    if( ((a2 - 1) & a2) != 0 )
      ProtectionMask = a2 & ~(a2 - 1);
    if( ProtectionMask < 0x10000 )
      ProtectionMask = 0x10000i64;
    if( ProtectionMask >= 0x7FFFFFFF0000i64 )
      return 3221225485i64;
  }
  else
  {
    ProtectionMask = 0x200000i64;
  }
  if( a2 >= 0x7FFFFFFF0000i64
    || a3 && (a3 > 0x7FFFFFFEFFFFi64 || 0x7FFFFFFF0000i64 - a3 < a2 || ((ProtectionMask - 1) & a3) != 0 || a4) )
  {
    return 3221225485i64;
  }
  Pool = MiAllocatePool(64i64, 0x88ui64, 0x45646156ui64);
  v13 = Pool;
  if( !Pool )
    return 3221225626i64;
  if( v9 )
  {
LABEL_29:
    v20 = v13[12];
    *((_QWORD *)v13 + 5) = 0i64;
    *((_QWORD *)v13 + 2) = -2i64;
    v13[12] = v20 & 0xFDEFF07F | 0x2100200;
    LOCK_ADDRESS_SPACE(CurrentThread, Process);
    LODWORD(v21) = MiGetUserReservationHighestAddress((INT64)Process, a4);
    if( v5 )
    {
      v22 = (v5 + a2 - 1) | 0xFFF;
      MiIsVaRangeAvailable(Process, (VOID *)v5, v22 - v5 + 1, 0i64);
      if( !v23 )
      {
        inserted = -1073741800;
        goto LABEL_23;
      }
    }
    else
    {
      LODWORD(v28) = 0;
      LODWORD(HINTHonored) = 6;
      inserted = MiSelectUserAddress(0i64, 0i64, v21, a2, ProtectionMask, 0i64, HINTHonored, v28);
      if( inserted < 0 )
        goto LABEL_23;
      v5 = 0i64;
      v22 = a2 - 1;
    }
    v24 = v5 >> 12;
    v25 = v22 >> 12;
    *((_BYTE *)v13 + 32) = BYTE4(v24);
    *((_BYTE *)v13 + 33) = BYTE4(v25);
    v13[6] = v24;
    v13[7] = v25;
    inserted = MiInsertVadCharges((_MMVAD_SHORT *)v13, (ULONG_PTR)Process);
    if( inserted >= 0 )
    {
      MiLockVad(CurrentThread, (_MMVAD_SHORT *)v13);
      MiInsertPrivateVad((_MMVAD_SHORT *)v13, (_MI_PHYSICAL_VIEW *)Process, v26);
      MiReferenceVad((_MMVAD_SHORT *)v13);
      UNLOCK_ADDRESS_SPACE_UNORDERED(CurrentThread, Process);
      *a5 = v13;
      return 0i64;
    }
    goto LABEL_23;
  }
  Pool[16] |= 1u;
  v15 = MiReservePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), 1ui64);
  *((_QWORD *)v13 + 10) = v15;
  if( !v15 )
  {
    ExFreePoolWithTag(v13, 0);
    return 3221225626i64;
  }
  if( a1 != 2
    || (v13[18] |= 1u, v16 = MiAllocatePool(64i64, 0x1000ui64, 0x6E45694Dui64), (*((_QWORD *)v13 + 11) = v16) != 0i64) )
  {
    v13[12] = v13[12] & 0xFFFFFF8F | 0x30;
    *((_QWORD *)v13 + 15) = 0i64;
    goto LABEL_29;
  }
  inserted = -1073741670;
LABEL_23:
  UNLOCK_ADDRESS_SPACE(CurrentThread, Process);
  if( (v13[16] & 1) != 0 )
  {
    v19 = (void *)*((_QWORD *)v13 + 11);
    if( v19 )
      ExFreePoolWithTag(v19, 0);
    MiReleasePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), *((_MMPTE **)v13 + 10), 1ui64, v18);
  }
  ExFreePoolWithTag(v13, 0);
  return(unsigned int)inserted;
}

Referenced by:

MiCreateEnclave