MiCommitEnclavePages
__int64 __fastcall MiCommitEnclavePages(
__int64 a1,
__int64 a2,
unsigned __int64 a3,
unsigned __int64 a4,
int a5,
unsigned int a6){
unsigned int v7;
_MMPTE *PteBase;
_MI_PARTITION *v9;
MMPTE *v10;
unsigned int v11;
UINT64 v12;
UINT64 v13;
char *v14;
INT64 v15;
UINT8 v16;
UINT8 v17;
INT64 v18;
INT64 v19;
int v20;
bool v21;
UINT64 v22;
MMPTE *EndingPte;
UINT64 v24;
CHAR v25;
UINT8 v27;
if( a5 != 4096 )
return 3221225715i64;
v7 = a6;
if( (a6 & 7) == 0 || a6 > 7 || (a6 & 5) == 5 )
return 3221225714i64;
PteBase = MmGetPteBase();
v9 = (_MI_PARTITION *)((char *)PteBase + ((a3 >> 9) & 0x7FFFFFFFF8i64));
v10 = (_MMPTE *)((char *)PteBase + ((a4 >> 9) & 0x7FFFFFFFF8i64));
v11 = 0;
v12 = (UINT64)v9;
v13 = 0i64;
v14 = 0i64;
v15 = *((_QWORD *)KeGetCurrentThread() + 23) + 1664i64;
v16 = MiLockWorkingSetShared(v15);
v27 = v16;
if( v9 > (_MI_PARTITION *)v10 )
goto LABEL_27;
v17 = v16;
do
{
if( (v12 & 0x78) == 0 && (_MI_PARTITION *)v12 != v9 )
{
if( MiWorkingSetIsContended(v15) || KeShouldYieldProcessor() )
goto LABEL_14;
if( !v14 )
goto LABEL_20;
MiPageTableLockIsContended(v15, (UINT64)v14, v18, v19, (INT64)EndingPte, v24, v25);
if( v20 )
{
LABEL_14:
if( v14 )
{
MiUnlockPageTableInternal(v15, (UINT64)v14);
v14 = 0i64;
}
MiUnlockWorkingSetShared(v15, v17);
MiLockWorkingSetShared(v15);
}
}
if( v14 )
{
if( (v12 & 0xFFF) != 0 )
goto LABEL_21;
MiUnlockPageTableInternal(v15, (UINT64)v14);
}
LABEL_20:
v14 = (char *)MmGetPteBase() + ((v12 >> 9) & 0x7FFFFFFFF8i64);
MiMakeSystemAddressValid(v12, 0i64, (*(_DWORD *)(a2 + 48) >> 12) & 0x3F, v17, 0);
LABEL_21:
v21 = (MI_READ_PTE_LOCK_FREE(v12) & 1) == 0;
v22 = v13 + 1;
if( !v21 )
v22 = v13;
v12 += 8i64;
v13 = v22;
}
while( v12 <= (unsigned __int64)v10 );
v7 = a6;
if( v14 )
MiUnlockPageTableInternal(v15, (UINT64)v14);
v16 = v27;
LABEL_27:
MiUnlockWorkingSetShared(v15, v16);
if( v13 )
{
LODWORD(EndingPte) = v7;
return(unsigned int)MiAddPagesToEnclave(a2, v13, v9, v10, EndingPte, v24);
}
return v11;
}Referenced by:
MiAllocateVirtualMemory