MiLoadDataIntoVsmEnclave

NTSTATUS __fastcall MiLoadDataIntoVsmEnclave(
        INT64 a1,
        INT64 a2,
        INT64 *a3,
        INT64 a4,
        UINT64 StartingAddress,
        INT64 a6,
        UINT64 *a7,
        VOID *Base,
        INT64 a9,
        UINT64 Protect,
        _QWORD *a11){
  INT64 v12; 
  NTSTATUS result; 
  unsigned int v14; 
  unsigned int ProtectionMask; 
  __int64 v16; 
  NTSTATUS VsmEnclaveData; 
  INT64 v18; 
  UINT64 *v19; 
  UINT64 *a5; 
  CHAR AccessMode; 
  _KAPC_STATE ApcState; 
  AccessMode = a4;
  memset(&ApcState, 0, sizeof(ApcState));
  v12 = 0i64;
  *a11 = 0i64;
  if( a9 != 4096 )
    return -1073741582;
  if( (_DWORD)a6 != 4 )
    return -1073741820;
  v14 = *(_DWORD *)a7;
  if( !*(_DWORD *)a7 )
    return -1073741811;
  if( v14 > 2 )
  {
    if( v14 == 3 )
      goto LABEL_10;
    if( v14 != 4 )
    {
      if( v14 == 5 )
      {
LABEL_10:
        if( Base )
          return -1073741583;
        goto LABEL_14;
      }
      return -1073741811;
    }
  }
  if( !Base )
    return -1073741819;
LABEL_14:
  ProtectionMask = MiMakeProtectionMask(Protect & 0x5FFFFFFF);
  if( (ProtectionMask & 7) == 0 || ProtectionMask > 7 || (ProtectionMask & 5) == 5 )
    return -1073741755;
  if( (ProtectionMask & 2) != 0
    && (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2512i64) & 0x100) != 0
    && (*((_DWORD *)KeGetCurrentThread() + 324) & 0x40000) == 0 )
  {
    return -1073740284;
  }
  if( MiCountCommittedPages(StartingAddress, StartingAddress + 4095, (__int64)a3, v16 + 1664) )
    return -1073741791;
  LODWORD(a5) = 0;
  result = MiCommitExistingVad((_MMVAD_SHORT *)a3, (PVOID)StartingAddress, 0x1000ui64, (unsigned int)Protect, a5);
  VsmEnclaveData = result;
  if( result >= 0 )
  {
    if( Base )
    {
      MmSizeOfMdl(Base, 0x1000ui64);
      LODWORD(v18) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
      v12 = v18;
      if( !v18 )
      {
        VsmEnclaveData = -1073741670;
LABEL_37:
        MiDecommitRegion((_MMVAD_SHORT *)a3, (PVOID)StartingAddress, (PVOID)(StartingAddress + 4095));
LABEL_38:
        if( v12 )
        {
          if( (*(_BYTE *)(v12 + 10) & 2) != 0 )
            MmUnlockPages((_MDL *)v12);
          ExFreePoolWithTag((PVOID)v12, 0);
        }
        return VsmEnclaveData;
      }
      *(_QWORD *)v18 = 0i64;
      *(_WORD *)(v18 + 8) = 8 * (((unsigned __int16)(((unsigned __int16)Base & 0xFFF) + 0x1FFF) >> 12) + 6);
      *(_WORD *)(v18 + 10) = 0;
      *(_QWORD *)(v18 + 32) = (unsigned __int64)Base & 0xFFFFFFFFFFFFF000ui64;
      *(_DWORD *)(v18 + 44) = (unsigned __int16)Base & 0xFFF;
      *(_DWORD *)(v18 + 40) = 4096;
      KiStackAttachProcess((_KPROCESS *)a2, 0i64, &ApcState);
      if( AccessMode == 1 && ((unsigned __int64)Base + 4096 > 0x7FFFFFFF0000i64 || (char *)Base + 4096 < Base) )
        MEMORY[0x7FFFFFFF0000] = 0;
      MmProbeAndLockPages((_MDL *)v12, AccessMode, IoReadAccess);
      v19 = a7;
      KiUnstackDetachProcess(&ApcState, 0i64);
      if( VsmEnclaveData < 0 )
        goto LABEL_37;
    }
    else
    {
      v19 = a7;
    }
    VsmEnclaveData = PsLoadVsmEnclaveData(a3[9], StartingAddress, *(unsigned int *)v19, (unsigned int)Protect, v12);
    if( VsmEnclaveData >= 0 )
      *a11 = 4096i64;
    if( VsmEnclaveData >= 0 )
      goto LABEL_38;
    goto LABEL_37;
  }
  return result;
}

Referenced by:

NtLoadEnclaveData