MmAccessFault

NTSTATUS __stdcall MmAccessFault(UINT64 FaultStatus, PVOID VirtualAddress, INT8 PreviousMode, PVOID TrapInformation){
  INT64 v5; 
  PVOID v6; 
  unsigned __int64 v7; 
  unsigned __int64 v8; 
  _MMPTE *PteBase; 
  int v10; 
  unsigned int v11; 
  int FileExtents; 
  _MMPTE *v13; 
  UINT64 v14; 
  VOID *v15; 
  _MMINPAGE_SUPPORT *v16; 
  _DWORD *v17; 
  UINT64 v18; 
  _MMSUPPORT_INSTANCE *v19; 
  char v20; 
  unsigned __int64 v21; 
  _ETHREAD *CurrentThread; 
  NTSTATUS result; 
  _ETHREAD *v24; 
  __int64 v25; 
  _MI_PARTITION *v26; 
  UINT64 AvailablePages; 
  NTSTATUS v28; 
  __int64 v29; 
  INT64 v30; 
  unsigned __int64 v31; 
  char *v32; 
  _KGATE *ExitOutswapGate; 
  char v34; 
  INT64 v35; 
  unsigned int v36; 
  int v37; 
  INT64 v38; 
  int v39; 
  _MMSUPPORT_INSTANCE *v40; 
  VOID *v41; 
  UINT64 v42; 
  VOID *VirtualAddressa[2]; 
  INT64 v44[16]; 
  _MMSUPPORT_INSTANCE FaultStatusa; 

  VirtualAddressa[0] = 0i64;
  v5 = (INT64)TrapInformation;
  v6 = VirtualAddress;
  v7 = FaultStatus;
  if( (FaultStatus & 9) == 9 )
    KeBugCheckEx(0x1Au, (PVOID)0x61941, VirtualAddress, (PVOID)FaultStatus, TrapInformation);
  if( (__int64)VirtualAddress >> 47 != -1 && (__int64)VirtualAddress >> 47 != 0 )
  {
    if( PreviousMode == 1 )
      return -1073741819;
    if( ((unsigned __int8)TrapInformation & 1) != 0 )
    {
      v36 = *(unsigned __int8 *)((unsigned __int64)TrapInformation & 0xFFFFFFFFFFFFFFFEui64);
      if( (unsigned __int8)v36 <= 6u )
      {
        v37 = 74;
        if( _bittest(&v37, v36) )
          return -1073741819;
      }
    }
    else if( KeInvalidAccessAllowed(TrapInformation) == 1 )
    {
      return -1073741819;
    }
    KeBugCheckEx(0x50u, v6, (PVOID)v7, (PVOID)v5, (PVOID)4);
  }
  if( (FaultStatus & 0x8000) != 0 )
  {
    if( PreviousMode == 1 )
      return MiHandleEnclaveFault((UINT64)VirtualAddress);
    else
      return -1073740638;
  }
  memset(&FaultStatusa.AgeDistribution[2], 0, 80);
  v8 = ((unsigned __int64)VirtualAddress >> 9) & 0x7FFFFFFFF8i64;
  PteBase = MmGetPteBase();
  FaultStatusa.WorkingSetExpansionLinks.Flink = (_LIST_ENTRY *)((char *)PteBase + v8);
  FaultStatusa.WorkingSetExpansionLinks.Blink = (_LIST_ENTRY *)((char *)PteBase
                                                              + ((((unsigned __int64)PteBase + v8) >> 9) & 0x7FFFFFFFF8i64));
  FaultStatusa.AgeDistribution[0] = (unsigned __int64)PteBase
                                  + (((unsigned __int64)FaultStatusa.WorkingSetExpansionLinks.Blink >> 9) & 0x7FFFFFFFF8i64);
  FaultStatusa.AgeDistribution[1] = (unsigned __int64)PteBase
                                  + ((FaultStatusa.AgeDistribution[0] >> 9) & 0x7FFFFFFFF8i64);
  v10 = 0;
  if( (v7 & 0x40) != 0 )
  {
    v10 = 32;
    v7 &= ~2ui64;
  }
  FaultStatusa.TrimmedPageCount = v7;
  *(_QWORD *)&FaultStatusa.NextPageColor = v6;
  FaultStatusa.VmWorkingSetList = (_MMWSL_INSTANCE *)TrapInformation;
  LODWORD(FaultStatusa.AgeDistribution[5]) = ((unsigned __int8)v10 ^ (unsigned __int8)(PreviousMode << 6)) & 0x40 ^ v10;
  if( KeGetCurrentIrql() > 1u )
  {
    MiRaisedIrqlFault((UINT64)&FaultStatusa, PteBase, (VOID *)0x7FFFFFFFF8i64, (_MMPTE **)TrapInformation);
    return result;
  }
  while( 1 )
  {
    v11 = 4096;
    if( (unsigned __int64)v6 < 0xFFFF800000000000ui64
      || (v28 = MiSystemFault((UINT64 *)&FaultStatusa.NextPageColor), FileExtents = v28, v28 == 192) )
    {
      FileExtents = MiUserFault((UINT64 *)&FaultStatusa.NextPageColor);
      if( FileExtents != -1073741802 )
        goto LABEL_19;
    }
    else if( v28 != -1073741802 )
    {
      goto LABEL_26;
    }
    FileExtents = MiDispatchFault(
                    (UINT64)&FaultStatusa,
                    VirtualAddressa,
                    v13,
                    v14,
                    v40,
                    v42,
                    VirtualAddressa[0],
                    (_MMVAD *)VirtualAddressa[1],
                    v44[0],
                    (_MMINPAGE_SUPPORT **)v44[1]);
    if( FileExtents == -1073741802 )
    {
      if( *(_QWORD *)&FaultStatusa.NextPageColor < 0xFFFF800000000000ui64
        && FaultStatusa.AgeDistribution[7] != *(&stru_140C4DB30 + 9)
        && (!*(&stru_140C4DB30 + 10) || FaultStatusa.AgeDistribution[7] != *(&stru_140C4DB30 + 10)) )
      {
        if( !FaultStatusa.AgeDistribution[6] )
          FaultStatusa.AgeDistribution[6] = (unsigned __int64)MiLocateAddress(*(VOID **)&FaultStatusa.NextPageColor);
        MiGetProtoPteAddress();
        if( !v31 )
        {
          MiReleaseFaultSynchronization((INT64)&FaultStatusa);
          FaultStatusa.AgeDistribution[7] = 0i64;
          FileExtents = -1073741819;
          goto LABEL_39;
        }
        if( FaultStatusa.AgeDistribution[7] != v31 )
          FaultStatusa.AgeDistribution[7] = v31;
        MiRetainSubsection((_SUBSECTION *)FaultStatusa.ExitOutswapGate);
      }
      LODWORD(FaultStatusa.AgeDistribution[5]) &= ~0x100u;
      FileExtents = 0;
    }
    else
    {
      v17 = VirtualAddressa[0];
      if( VirtualAddressa[0] )
      {
        v29 = *((_QWORD *)VirtualAddressa[0] + 32);
        v11 = *((_DWORD *)VirtualAddressa[0] + 78);
        if( v29 )
          v11 = *(_DWORD *)(v29 + 40);
        if( PreviousMode == 1 )
          *((_DWORD *)VirtualAddressa[0] + 48) |= 0x40000u;
        if( (v17[48] & 1) != 0 && (int)v17[20] >= 0 )
        {
          FileExtents = MiFaultGetFileExtents((INT64)&FaultStatusa, (INT64)v17);
          FaultStatusa.AgeDistribution[7] = 0i64;
          goto LABEL_19;
        }
        FileExtents = MiIssueHardFault(&FaultStatusa, (ULONG_PTR)v17, v15, v16, v41, v42, (CHAR)VirtualAddressa[0]);
      }
      FaultStatusa.AgeDistribution[7] = 0i64;
    }
    if( (FaultStatusa.AgeDistribution[5] & 0x10) != 0 )
    {
      memset(v44, 0i64, sizeof(v44));
      *(_OWORD *)&v44[3] = *(_OWORD *)&FaultStatusa.AgeDistribution[2];
      v44[5] = FaultStatusa.AgeDistribution[4];
      MiUnlockSystemVa((INT64)v44);
      LODWORD(FaultStatusa.AgeDistribution[5]) &= ~0x10u;
    }
    else
    {
      v18 = FaultStatusa.AgeDistribution[4];
      v19 = (_MMSUPPORT_INSTANCE *)FaultStatusa.AgeDistribution[2];
      if( FaultStatusa.AgeDistribution[4] )
      {
        if( WORD1(FaultStatusa.AgeDistribution[3]) )
        {
          MiEmptyDeferredWorkingSetEntries((INT64)&FaultStatusa.AgeDistribution[2]);
          v18 = FaultStatusa.AgeDistribution[4];
        }
        MiUnlockPageTableInternal((INT64)v19, v18);
        v20 = BYTE5(FaultStatusa.AgeDistribution[3]) | 2;
        FaultStatusa.AgeDistribution[4] = 0i64;
        BYTE5(FaultStatusa.AgeDistribution[3]) |= 2u;
      }
      else
      {
        v20 = BYTE5(FaultStatusa.AgeDistribution[3]);
      }
      if( (v20 & 1) != 0 )
        MiUnlockWorkingSetExclusive(v19, BYTE4(FaultStatusa.AgeDistribution[3]));
      else
        MiUnlockWorkingSetShared(v19, BYTE4(FaultStatusa.AgeDistribution[3]));
    }
LABEL_19:
    if( (FaultStatusa.AgeDistribution[5] & 1) != 0 )
      MiDeprioritizeVad(
        (_MMVAD *)FaultStatusa.AgeDistribution[6],
        *(VOID **)&FaultStatusa.NextPageColor,
        (_ETHREAD *)v13);
    if( FaultStatusa.MinimumWorkingSetSize )
    {
      if( FaultStatusa.MinimumWorkingSetSize == -1i64 )
      {
        MiReplenishTransitionPageHeatList();
      }
      else
      {
        MiProcessTransitionHeatBatch(FaultStatusa.MinimumWorkingSetSize);
        MiFreeTransitionPageHeatList((PSLIST_ENTRY)FaultStatusa.MinimumWorkingSetSize);
      }
      FaultStatusa.MinimumWorkingSetSize = 0i64;
    }
    if( FaultStatusa.WorkingSetLeafSize )
    {
      v35 = (FaultStatusa.AgeDistribution[5] & 0x40) != 0 ? 0i64 : 0x20000i64;
      MiReplenishSlabAllocator(
        FaultStatusa.WorkingSetLeafSize,
        *(_QWORD *)(*(&stru_140C4DB30 + 267)
                  + 8i64 * (*(_WORD *)(*(_QWORD *)FaultStatusa.ExitOutswapGate + 60i64) & 0x3FF)),
        FaultStatusa.WorkingSetLeafPrivateSize,
        v35);
      FaultStatusa.WorkingSetLeafSize = 0i64;
    }
    else if( ((__int64)FaultStatusa.VmWorkingSetList & 1) != 0
           && *(_BYTE *)((unsigned __int64)FaultStatusa.VmWorkingSetList & 0xFFFFFFFFFFFFFFFEui64) == 5 )
    {
      v38 = *(_QWORD *)(((unsigned __int64)FaultStatusa.VmWorkingSetList & 0xFFFFFFFFFFFFFFFEui64) + 48);
      if( v38 )
        MiReplenishSlabAllocator(
          v38,
          *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8i64 * *(unsigned __int16 *)(FaultStatusa.AgeDistribution[2] + 174)),
          1ui64,
          0i64);
    }
    v21 = FaultStatusa.AgeDistribution[2];
    if( (*(_BYTE *)(FaultStatusa.AgeDistribution[2] + 184) & 7) != 0 )
    {
      if( (*(_DWORD *)(FaultStatusa.AgeDistribution[2] + 4) & 0xFFF) == 0 )
        goto LABEL_63;
    }
    else
    {
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      if( CurrentThread->Tcb.Priority >= 16
        && (CurrentThread->SameThreadPassiveFlags & 0xC) == 0
        && (CurrentThread->SameThreadPassiveFlags & 2) == 0 )
      {
        v21 = FaultStatusa.AgeDistribution[2];
        if( (__int64)(*(_QWORD *)(FaultStatusa.AgeDistribution[2] + 120)
                     - *(_QWORD *)(FaultStatusa.AgeDistribution[2] + 112)) > 100 )
        {
LABEL_63:
          v30 = *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8i64 * *(unsigned __int16 *)(v21 + 174));
          if( v30 && !MiSufficientAvailablePages(v30, 0x420ui64) )
            KeDelayExecutionThread(0, 0, (_LARGE_INTEGER *)&Interval);
        }
      }
    }
LABEL_26:
    if( !FileExtents )
      goto LABEL_29;
    if( FileExtents == -1073740748 )
    {
      FileExtents = 0;
      goto LABEL_29;
    }
    if( FileExtents >= 0 )
      goto LABEL_29;
LABEL_39:
    if( MiIsRetryIoStatus((unsigned int)FileExtents, v11) )
    {
      v24 = (_ETHREAD *)KeGetCurrentThread();
      if( (v24->$84F33738BEE95ACDF5C5BF1C8FDC7C8C::_bf_0 & 4) != 0 || (v24->SameThreadPassiveFlags & 0xC) != 0 )
      {
        FileExtents = -1073741801;
      }
      else if( ((__int64)FaultStatusa.VmWorkingSetList & 1) != 0
             && *(_BYTE *)((unsigned __int64)FaultStatusa.VmWorkingSetList & 0xFFFFFFFFFFFFFFFEui64) == 5
             && (*(_DWORD *)(((unsigned __int64)FaultStatusa.VmWorkingSetList & 0xFFFFFFFFFFFFFFFEui64) + 56) & 0xC) != 0 )
      {
        FileExtents = -1073741608;
      }
      else
      {
        v25 = *(unsigned __int16 *)(FaultStatusa.AgeDistribution[2] + 174);
        v26 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * v25);
        if( SLOBYTE(FaultStatusa.AgeDistribution[5]) < 0
          || !MiSufficientAvailablePages(*(_QWORD *)(*(&stru_140C4DB30 + 267) + 8 * v25), 0x420ui64)
          || v26->Vp.ResidentAvailablePages < 0x400 )
        {
          KeDelayExecutionThread(0, 0, (_LARGE_INTEGER *)&Interval);
        }
        AvailablePages = v26->Vp.AvailablePages;
        if( AvailablePages )
          --AvailablePages;
        if( AvailablePages < 0x9F )
        {
          v39 = *(_DWORD *)&KeGetCurrentThread()[1].gapD8[12];
          if( (v39 & 0xC) != 8
            && (AvailablePages < 0x20 && v26 == &Irp
             || ((v39 & 2) == 0 || AvailablePages < 0x21) && (v26->Core.u.LongFlags & 0x20) == 0) )
          {
            MiWaitForFreePage(v26, AvailablePages);
          }
        }
        FileExtents = 0;
      }
    }
LABEL_29:
    if( (FaultStatusa.AgeDistribution[5] & 2) != 0 )
      MiCopyOnWriteCheckConditions(FaultStatusa.AgeDistribution[2], 3221225495i64);
    if( (FaultStatusa.AgeDistribution[5] & 4) != 0 )
      MiCopyOnWriteCheckConditions(FaultStatusa.AgeDistribution[2], 3221226548i64);
    if( !FaultStatusa.AgeDistribution[7] )
      break;
    v32 = (char *)(v5 & 0xFFFFFFFFFFFFFFFEui64);
    if( (v5 & 1) == 0 )
      goto LABEL_80;
    if( *v32 == 1 )
      goto LABEL_87;
    if( (v5 & 1) == 0 )
      goto LABEL_80;
    v34 = *v32;
    if( *v32 == 2 )
    {
LABEL_87:
      v32[1] = 1;
LABEL_80:
      v5 = 0i64;
      goto LABEL_81;
    }
    if( v34 == 5 || v34 != 6 )
      goto LABEL_80;
LABEL_81:
    ExitOutswapGate = FaultStatusa.ExitOutswapGate;
    MiInitializePageFaultPacket(2i64, FaultStatusa.AgeDistribution[7], 0, v5, (INT64)&FaultStatusa);
    LODWORD(FaultStatusa.AgeDistribution[5]) |= 8u;
    v6 = *(PVOID *)&FaultStatusa.NextPageColor;
    FaultStatusa.ExitOutswapGate = ExitOutswapGate;
  }
  if( FaultStatusa.ExitOutswapGate )
    MiReleaseFaultCharges(FaultStatusa.ExitOutswapGate);
  return FileExtents;
}

Referenced by:

ExpSvmServicePageFault
KiPageFault
MiCheckProtoPtePageState
MiCommitExistingVad
MiDeletePerSessionProtos
MiDeleteSubsectionPages
MiEliminateStaleExtents
MiEnableLargeSubsection
MiFaultInProbeAddress
MiGetNextPageTablePte
MiInPagePageTable
MiInPageSingleKernelStack
MiInitializeDynamicPfns
MiInitializeImageProtos
MiInitializeProtoPfn
MiInitializePrototypePtes
MiLockCode
MiLockDriverPageRange
MiLockPagedAddress
MiMakeDriverPagesPrivate
MiMakeImageReadOnly
MiMakeProtoAddressValid
MiMakeSystemAddressValid
MiPfPutPagesInTransition
MiPrefetchVirtualMemory
MiProbeLeafPteAccess
MiPurgeImageSection
MiReleaseOutSwapReservations
MiSectionCreated
MiSetProtectionOnSection
MiUpdateImportRelocationsOnDriverPrivatePages
MiWalkEntireImage
MiWalkVaRange
MmCheckCachedPageStates
MmCopyToCachedPage
MmProtectPool
MmVirtualAccessFault