MiLoadDataIntoVsmEnclave

NTSTATUS __stdcall MiLoadDataIntoVsmEnclave(
        INT64 a1,
        INT64 a2,
        INT64 a3,
        INT64 a4,
        INT64 StartingAddress,
        INT64 a6,
        INT64 a7,
        PVOID Base,
        INT64 a9,
        INT64 Protect,
        INT64 a11){
  INT64 v12; 
  NTSTATUS result; 
  unsigned int v14; 
  unsigned int ProtectionMask; 
  __int64 v16; 
  __int64 v17; 
  NTSTATUS VsmEnclaveData; 
  UINT64 v19; 
  _WORD *Pool; 
  _KPROCESSOR_MODE v21; 
  unsigned int *v22; 
  INT64 v23; 
  INT64 v24; 
  UINT64 *ChangeProtection; 
  INT64 v26; 
  INT64 v27; 
  INT64 v28; 
  INT64 v29; 
  _QWORD *v30; 
  PVOID Process; 
  _WORD *v32; 
  INT64 v33; 
  INT64 v34; 
  INT64 v35; 
  INT64 v36; 
  _KAPC_STATE ApcState; 

  LOBYTE(v27) = a4;
  Process = (PVOID)a2;
  v33 = a3;
  v34 = StartingAddress;
  v29 = a7;
  v35 = a7;
  v30 = (_QWORD *)a11;
  WORD2(v27) = 0;
  LODWORD(v28) = 0;
  memset(&ApcState, 0, sizeof(ApcState));
  v12 = 0i64;
  *(_QWORD *)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
    && (KeGetCurrentThread()->ApcState.Process->MitigationFlags & 0x100) != 0
    && (*(_DWORD *)&KeGetCurrentThread()[1].gapD8[8] & 0x40000) == 0 )
  {
    return -1073740284;
  }
  v36 = StartingAddress + 4095;
  LODWORD(v17) = MiCountCommittedPages(
                   (PVOID)StartingAddress,
                   (PVOID)(StartingAddress + 4095),
                   (_MMVAD_SHORT *)a3,
                   v16 + 1664);
  if( v17 )
    return -1073741791;
  LOBYTE(v26) = 0;
  LODWORD(ChangeProtection) = 0;
  result = MiCommitExistingVad(
             (_MMVAD_SHORT *)a3,
             (VOID *)StartingAddress,
             0x1000ui64,
             (unsigned int)Protect,
             ChangeProtection,
             0i64,
             v26,
             0i64,
             (INT64)&v28,
             (INT64)&v27 + 4,
             v27,
             v28);
  VsmEnclaveData = result;
  if( result >= 0 )
  {
    if( Base )
    {
      LODWORD(v19) = MmSizeOfMdl(Base, 4096);
      Pool = MiAllocatePool(64i64, v19, 0x6C646D4Dui64);
      v12 = (INT64)Pool;
      v32 = Pool;
      if( !Pool )
      {
        VsmEnclaveData = -1073741670;
LABEL_37:
        MiDecommitRegion((_MMVAD_SHORT *)a3, (VOID *)StartingAddress, (VOID *)(StartingAddress + 4095));
LABEL_38:
        if( v12 )
        {
          if( (*(_BYTE *)(v12 + 10) & 2) != 0 )
            MmUnlockPages(v12, v23, v24);
          ExFreePoolWithTag((PVOID)v12, 0);
        }
        return VsmEnclaveData;
      }
      *(_QWORD *)Pool = 0i64;
      Pool[4] = 8 * (((unsigned __int16)(((unsigned __int16)Base & 0xFFF) + 0x1FFF) >> 12) + 6);
      Pool[5] = 0;
      *((_QWORD *)Pool + 4) = (unsigned __int64)Base & 0xFFFFFFFFFFFFF000ui64;
      *((_DWORD *)Pool + 11) = (unsigned __int16)Base & 0xFFF;
      *((_DWORD *)Pool + 10) = 4096;
      KiStackAttachProcess(Process, 0i64, &ApcState);
      LOBYTE(v21) = v27;
      if( (_BYTE)v27 == 1 && ((unsigned __int64)Base + 4096 > 0x7FFFFFFF0000i64 || (char *)Base + 4096 < Base) )
        MEMORY[0x7FFFFFFF0000] = 0;
      MmProbeAndLockPages((PMDL)v12, v21, IoReadAccess);
      v22 = (unsigned int *)v29;
      KiUnstackDetachProcess(&ApcState, 0i64);
      if( VsmEnclaveData < 0 )
        goto LABEL_37;
    }
    else
    {
      v22 = (unsigned int *)v29;
    }
    VsmEnclaveData = PsLoadVsmEnclaveData(*(_EX_PUSH_LOCK **)(a3 + 72), StartingAddress, *v22, Protect, v12);
    if( VsmEnclaveData >= 0 )
      *v30 = 4096i64;
    if( VsmEnclaveData >= 0 )
      goto LABEL_38;
    goto LABEL_37;
  }
  return result;
}

Referenced by:

NtLoadEnclaveData