MiCreateHardwareEnclave

NTSTATUS __stdcall MiCreateHardwareEnclave(INT64 a1, INT64 a2, UINT64 a3, VOID *a4){
  _ETHREAD *CurrentThread; 
  _EPROCESS *Process; 
  unsigned __int64 v8; 
  _MI_PARTITION *VmPartition; 
  int Enclave; 
  UINT64 v12; 
  INT64 v13; 
  UINT64 v14; 
  __int64 v15; 
  __int64 v16; 
  int v17; 
  _EWOW64PROCESS *WoW64Process; 
  unsigned __int16 Machine; 
  bool v20; 
  int v21; 
  _QWORD *v22; 
  _QWORD *v23; 
  UINT64 *v24; 
  UINT64 *ReturnedError; 
  VOID *EnclaveBaseAddress; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  Process = CurrentThread->Tcb.ApcState.Process;
  EnclaveBaseAddress = (VOID *)((*(unsigned int *)(a2 + 24) | ((unsigned __int64)*(unsigned __int8 *)(a2 + 32) << 32)) << 12);
  v8 = ((*(unsigned int *)(a2 + 28) | ((unsigned __int64)*(unsigned __int8 *)(a2 + 33) << 32)) << 12) | 0xFFF;
  VmPartition = MiGetVmPartition(&Process->Vm, (_EPROCESS *)a2);
  if( !ExAcquireRundownProtection((_EX_RUNDOWN_REF *)&stru_140C4DB30 + 538) )
    return -1073741558;
  if( !a3 || (Enclave = MiReserveEnclavePages(a2, (INT64)VmPartition, (a3 >> 12) + ((a3 & 0xFFF) != 0)), Enclave >= 0) )
  {
    LODWORD(v12) = MiGetEnclavePage(VmPartition, 0i64);
    v13 = v12;
    if( v12 == -1i64 )
    {
      Enclave = -1073741801;
    }
    else
    {
      v14 = *(_QWORD *)(a2 + 80);
      MiInitializeEnclavePfn(v12, (_MMPTE *)v14, 4ui64);
      LODWORD(v15) = MiMakeValidPte((_XSTATE_CONFIGURATION *)v14, v13, 2684354564i64);
      v16 = v15;
      LOBYTE(v17) = MiPteInShadowRange(v14);
      if( v17 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v16 & 1) != 0 )
        v16 |= 0x8000000000000000ui64;
      *(_QWORD *)v14 = v16;
      WoW64Process = Process->WoW64Process;
      v20 = 0;
      if( WoW64Process )
      {
        Machine = WoW64Process->Machine;
        if( Machine == 332 || Machine == 452 )
          v20 = 1;
      }
      v21 = ((*(_DWORD *)(a2 + 72) & 1) << 8) | 1;
      if( v20 )
        v21 = (*(_DWORD *)(a2 + 72) & 1) << 8;
      LODWORD(ReturnedError) = v21;
      Enclave = KeCreateEnclave(
                  (VOID *)((__int64)((v14 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16),
                  EnclaveBaseAddress,
                  v8 - (_QWORD)EnclaveBaseAddress + 1,
                  a4,
                  v24,
                  ReturnedError);
      if( Enclave >= 0 )
      {
        *(_QWORD *)(a2 + 112) = Process;
        --CurrentThread->Tcb.SpecialApcDisable;
        ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&stru_140C4DB30 + 537, 0i64);
        v22 = (_QWORD *)*(&stru_140C4DB30 + 536);
        v23 = (_QWORD *)(a2 + 120);
        if( (_UNKNOWN *)**(&stru_140C4DB30 + 536) != (_UNKNOWN *)((char *)&stru_140C4DB30 + 4280) )
          __fastfail(3u);
        *v23 = (char *)&stru_140C4DB30 + 4280;
        v23[1] = v22;
        *v22 = v23;
        *(&stru_140C4DB30 + 536) = v23;
        if( (_InterlockedExchangeAdd64((_QWORD *)&stru_140C4DB30 + 537, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
          ExfTryToWakePushLock((_EX_PUSH_LOCK *)&stru_140C4DB30 + 537);
        KeAbPostRelease((char *)&stru_140C4DB30 + 4296);
        KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
        Enclave = 0;
      }
    }
  }
  ExReleaseRundownProtection((_EX_RUNDOWN_REF *)&stru_140C4DB30 + 538);
  return Enclave;
}

Referenced by:

MiCreateEnclave