MiInitializeEnclave

NTSTATUS __fastcall MiInitializeEnclave(PEPROCESS Process, UINT64 a2, VOID *SignatureInfo, INT64 a4){
  int v6; 
  INT64 v7; 
  VOID *v8; 
  INT64 v9; 
  int v11; 
  int v12; 
  __int64 v13[3]; 

  LODWORD(v13[0]) = 0;
  v6 = a4;
  LODWORD(v7) = MiObtainReferencedVadEx(a2, 0, v13);
  v9 = v7;
  if( !v7 )
    return v13[0];
  if( (*(_DWORD *)(v7 + 48) & 0x3100000) == 34603008 )
  {
    v12 = *(_DWORD *)(v7 + 64);
    if( (v12 & 2) != 0 )
    {
      v11 = -1073740528;
    }
    else if( (v12 & 1) != 0 )
    {
      if( v6 == 4096 )
      {
        v11 = KeInitializeEnclave(
                (VOID *)((__int64)((*(_QWORD *)(v9 + 80) << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16),
                SignatureInfo,
                v8,
                (UINT64 *)SignatureInfo + 256);
        if( v11 >= 0 )
        {
          MiReturnReservedEnclavePages(v9, -1i64);
          *(_DWORD *)(v9 + 64) |= 2u;
          v11 = 0;
        }
      }
      else
      {
        v11 = -1073741820;
      }
    }
    else
    {
      v11 = MiInitializeVsmEnclave(Process);
    }
  }
  else
  {
    v11 = -1073741800;
  }
  MiUnlockAndDereferenceVad((_MMVAD_SHORT *)v9);
  return v11;
}

Referenced by:

NtInitializeEnclave