MiCreateEnclave
INT64 __fastcall MiCreateEnclave(INT64 a1, UINT64 *a2, INT64 a3, VOID *a4, INT64 a5, UINT64 Size, INT64 a7, UINT64 a8){
int EnclaveVad;
_MMVAD *v11;
int v12;
void *v13;
int VsmEnclave;
void **v16;
void *P[3];
P[0] = 0i64;
v16 = P;
EnclaveVad = MiAllocateEnclaveVad((unsigned int)Size, a4, *a2);
v11 = (_MMVAD *)P[0];
v12 = EnclaveVad;
if( EnclaveVad >= 0 )
{
v13 = P[0];
*a2 = (*((unsigned int *)P[0] + 6) | ((unsigned __int64)*((unsigned __int8 *)P[0] + 32) << 32)) << 12;
if( (unsigned int)(Size - 16) <= 1 )
{
*((_QWORD *)v11 + 11) = (char *)v11 + 80;
*((_QWORD *)v11 + 10) = (char *)v11 + 80;
LODWORD(v16) = a8;
VsmEnclave = MiCreateVsmEnclave(a1, (INT64)v13, (unsigned int)Size, a7, (UINT64)v16);
}
else
{
VsmEnclave = MiCreateHardwareEnclave(a1, (INT64)v13, a5, (VOID *)a7);
}
v12 = VsmEnclave;
}
if( v11 )
{
if( v12 >= 0 )
MiUnlockAndDereferenceVad(v11);
else
MiDeleteVad(v11, 0i64);
}
return(unsigned int)v12;
}Referenced by:
NtCreateEnclave