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