MiFindNextEnclaveBoundary

__int64 __fastcall MiFindNextEnclaveBoundary(
        ULONG_PTR a1,
        unsigned __int64 a2,
        unsigned __int64 a3,
        unsigned __int64 *a4){
  _ETHREAD *CurrentThread; 
  __int64 v9; 
  unsigned int v10; 
  unsigned __int64 i; 
  char v13; 
  unsigned __int64 v14; 
  unsigned __int64 v15; 
  unsigned __int64 v16; 
  _QWORD **v17; 
  unsigned __int64 v18; 
  _QWORD *v19; 
  _KAPC_STATE ApcState; 
  memset(&ApcState, 0, sizeof(ApcState));
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v9 = *((_QWORD *)CurrentThread + 23);
  if( v9 != a1 )
    KiStackAttachProcess((_KPROCESS *)a1, 0i64, &ApcState);
  v10 = 0;
  if( *(_DWORD *)(*(_QWORD *)(a1 + 1680) + 296i64) )
  {
    LOCK_ADDRESS_SPACE((__int64)CurrentThread, a1);
    i = *(_QWORD *)(a1 + 2008);
    v13 = 0;
    if( i )
    {
      v14 = a2 >> 12;
      while( 1 )
      {
        if( v14 > (*(unsigned int *)(i + 28) | ((unsigned __int64)*(unsigned __int8 *)(i + 33) << 32)) )
        {
          v15 = *(_QWORD *)(i + 8);
          if( !v15 )
          {
            v16 = i;
            for( i = *(_QWORD *)(i + 16) & 0xFFFFFFFFFFFFFFFCui64; i; i = *(_QWORD *)(i + 16) & 0xFFFFFFFFFFFFFFFCui64 )
            {
              if( *(_QWORD *)i == v16 )
                break;
              v16 = i;
            }
LABEL_13:
            if( i )
            {
              while( (*(_DWORD *)(i + 48) & 0x3100000) != 34603008 || (*(_DWORD *)(i + 64) & 4) == 0 )
              {
                if( (*(unsigned int *)(i + 28) | ((unsigned __int64)*(unsigned __int8 *)(i + 33) << 32)) < (a2 + a3 - 1) >> 12 )
                {
                  v17 = *(_QWORD ***)(i + 8);
                  v18 = i;
                  if( v17 )
                  {
                    v19 = *v17;
                    for( i = *(_QWORD *)(i + 8); v19; v19 = (_QWORD *)*v19 )
                      i = (unsigned __int64)v19;
                  }
                  else
                  {
                    for( i = *(_QWORD *)(i + 16) & 0xFFFFFFFFFFFFFFFCui64;
                          i;
                          i = *(_QWORD *)(i + 16) & 0xFFFFFFFFFFFFFFFCui64 )
                    {
                      if( *(_QWORD *)i == v18 )
                        break;
                      v18 = i;
                    }
                  }
                  if( i )
                    continue;
                }
                goto LABEL_37;
              }
              a3 = ((*(unsigned int *)(i + 24) | ((unsigned __int64)*(unsigned __int8 *)(i + 32) << 32)) << 12) - a2;
            }
LABEL_37:
            *a4 = a3;
            goto LABEL_38;
          }
        }
        else
        {
          if( v14 >= (*(unsigned int *)(i + 24) | ((unsigned __int64)*(unsigned __int8 *)(i + 32) << 32)) )
          {
            v13 = 1;
            break;
          }
          v15 = *(_QWORD *)i;
          if( !*(_QWORD *)i )
            goto LABEL_13;
        }
        i = v15;
      }
    }
    if( !v13 || (*(_DWORD *)(i + 48) & 0x3100000) != 34603008 || (*(_DWORD *)(i + 64) & 4) == 0 )
      goto LABEL_13;
    *a4 = (((*(unsigned int *)(i + 28) | ((unsigned __int64)*(unsigned __int8 *)(i + 33) << 32)) << 12) | 0xFFF)
        - a2
        + 1;
    v10 = 2 - ((*(_BYTE *)(i + 64) & 1) != 0);
LABEL_38:
    UNLOCK_ADDRESS_SPACE((__int64)CurrentThread, a1);
  }
  else
  {
    *a4 = a3;
  }
  if( v9 != a1 )
    KiUnstackDetachProcess(&ApcState, 0i64);
  return v10;
}

Referenced by:

MmCopyVirtualMemory