MiActOnPte

INT64 __fastcall MiActOnPte(
        INT64 rcx0,
        INT64 a2,
        _MMPTE *a3,
        _MMPTE *a4,
        INT64 OperationArgument,
        INT64 Partition,
        _MI_PARTITION **OriginalPte,
        UINT64 *a8){
  unsigned int v8; 
  _MMPTE *v9; 
  _MMPTE *v10; 
  __int64 v11; 
  _MMPTE *v12; 
  INT64 v13; 
  UINT64 v14; 
  unsigned __int64 v15; 
  _MMPFN *v16; 
  INT64 v17; 
  _MMPFN *v18; 
  UINT64 v19; 
  bool v20; 
  unsigned __int64 v21; 
  CHAR updated; 
  _MMSUPPORT_INSTANCE *v24; 
  __int64 v25; 
  char v26; 
  char v27; 
  UINT64 v28; 
  __int64 v29; 
  INT64 v30; 
  char v31; 
  BOOL v32; 
  char v33; 
  int v34; 
  _MMPFN *v35; 
  UINT64 v36; 
  UINT64 v37; 
  char v38; 
  UINT64 v39; 
  int v40; 
  __int64 v41; 
  char v42; 
  _MI_PARTITION *v43; 
  __int64 v44; 
  INT64 v45; 
  UINT64 v46; 
  UINT64 SpinCount; 
  INT64 v48; 
  _MMPTE *v49; 
  INT64 a1; 
  int v52; 
  UINT64 ProtectCode; 
  v52 = a2;
  v8 = 0;
  LODWORD(ProtectCode) = 0;
  v9 = a4;
  v10 = a3;
  *a8 = 0i64;
  *OriginalPte = 0i64;
  v11 = *((_QWORD *)KeGetCurrentThread() + 23);
  a1 = v11 + 1664;
  v12 = a4;
  if( !a4 )
    v12 = a3;
  v49 = v12;
  while( 1 )
  {
    while( 1 )
    {
      v13 = MI_READ_PTE_LOCK_FREE((INT64)v12);
      v48 = v13;
      v15 = v13;
      if( (v13 & 1) == 0 )
        break;
      if( !v9 )
      {
        v21 = MI_READ_PTE_LOCK_FREE((INT64)&v48);
        if( ((*((_QWORD *)MmGetPfnDb() + 6 * ((v21 >> 12) & 0xFFFFFFFFFi64) + 5) >> 50) & 1) == 0 )
          return 3221226548i64;
        v16 = (_MMPFN *)((char *)MmGetPfnDb() + 48 * ((v21 >> 12) & 0xFFFFFFFFFi64));
        if( (*((_QWORD *)v16 + 5) & 0x1000000000i64) != 0 || *((__int64 *)v16 + 1) <= 0 )
        {
          if( MiLocateCloneAddress(v11, *((_QWORD *)v16 + 1) | 0x8000000000000000ui64) )
            return 3221226548i64;
        }
        else
        {
          if( (_DWORD)OperationArgument == 1 )
            return 3221226548i64;
          if( !(_DWORD)OperationArgument )
            return 274i64;
        }
        LODWORD(SpinCount) = 0;
        while( _interlockedbittestandset64((volatile signed __int32 *)v16 + 6, 0x3Fui64) )
        {
          do
            KeYieldProcessorEx(&SpinCount);
          while( *((__int64 *)v16 + 3) < 0 );
        }
        if( (*(_DWORD *)(rcx0 + 48) & 0x70) == 64 && (unsigned int)MiRotatedToFrameBuffer(v10) )
          goto LABEL_30;
        LOBYTE(v17) = v48;
LABEL_33:
        if( (_DWORD)OperationArgument == 2 )
        {
          updated = MiUpdatePfnPriority((INT64)v16);
          _InterlockedAnd64((volatile signed __int64 *)v16 + 3, 0x7FFFFFFFFFFFFFFFui64);
          v24 = (_MMSUPPORT_INSTANCE *)a1;
          if( updated != -1 && !v9 )
            MiUpdateWsleAge(a1, v10, updated);
          if( (*((_QWORD *)v16 + 5) & 0x1000000000i64) == 0 )
          {
            v25 = *((_QWORD *)v16 + 1);
            if( v25 > 0 && !v9 )
              MiDemoteCombinedPte(v24, v10, (_MMPTE *)(v25 | 0x8000000000000000ui64));
          }
          return 0i64;
        }
        v26 = *((_BYTE *)v16 + 34);
        if( (v26 & 8) != 0 )
        {
LABEL_30:
          _InterlockedAnd64((volatile signed __int64 *)v16 + 3, 0x7FFFFFFFFFFFFFFFui64);
          return 3221226548i64;
        }
        v27 = v26 & 0x10;
        if( (_DWORD)OperationArgument == 1 )
        {
          if( v27 || !v9 && (v17 & 0x42) != 0 )
            v8 = -1073740748;
          if( !v27 && (*((_DWORD *)v16 + 4) & 4) == 0 )
            *((_BYTE *)v16 + 34) = v26 | 0x10;
          if( MI_IS_RESET_PTE(*((_QWORD *)v16 + 2)) )
          {
            MI_CLEAR_RESET_PTE((MMPTE *)((char *)v16 + 16));
            _InterlockedAnd64((volatile signed __int64 *)v16 + 3, 0x7FFFFFFFFFFFFFFFui64);
            return v8;
          }
          else
          {
            _InterlockedAnd64((volatile signed __int64 *)v16 + 3, 0x7FFFFFFFFFFFFFFFui64);
            return 3221226548i64;
          }
        }
        else
        {
          if( v27 )
            *((_BYTE *)v16 + 34) = v26 & 0xEF;
          v28 = MiCapturePageFileInfoInline((UINT64 *)v16 + 2, 1i64, 1i64);
          *a8 = v28;
          if( v28 )
            *OriginalPte = *(_MI_PARTITION **)(qword_140C4E388 + 8 * ((*((_QWORD *)v16 + 5) >> 39) & 0x3FFi64));
          *((_QWORD *)v16 + 2) = MiUpdatePageFileHighInPte(*((_QWORD *)v16 + 2), 1i64) & 0xFFFFFFFFFFFFFFFDui64;
          _InterlockedAnd64((volatile signed __int64 *)v16 + 3, 0x7FFFFFFFFFFFFFFFui64);
          if( v9 || (v48 & 0x42) == 0 )
            return 0i64;
          MiWriteValidPteNewProtection((INT64 *)v10, v48 & 0xFFFFFFFFFFFFFF9Dui64);
          v29 = (__int64)(((_QWORD)v10 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
          if( (unsigned __int8)MiGetVaAge(v30, v29) < 7u )
            MiSetVaAgeList(a1, v29, (UINT8 *)1, 1u);
          return 3221225505i64;
        }
      }
      v16 = MiLockLeafPage(v9, 0i64);
      v12 = v49;
      if( v16 )
      {
        v17 = MI_READ_PTE_LOCK_FREE((INT64)v9);
        v48 = v17;
        if( (v17 & 1) != 0 )
          goto LABEL_33;
        _InterlockedAnd64((volatile signed __int64 *)v16 + 3, 0x7FFFFFFFFFFFFFFFui64);
        v12 = v49;
      }
    }
    if( (v13 & 0x400) != 0 )
      return 0i64;
    if( (v13 & 0x800) == 0 )
      break;
    if( v9 )
      v18 = MiLockLeafPage(v9, 0i64);
    else
      v18 = MiLockTransitionLeafPage(v10, 0i64);
    v19 = (UINT64)v18;
    v20 = v18 == 0i64;
    v12 = v49;
    if( !v20 )
    {
      if( !v9 || (v48 = MI_READ_PTE_LOCK_FREE((INT64)v9), (v48 & 1) == 0) )
      {
        if( (_DWORD)OperationArgument == 2 )
        {
          MiUpdatePfnPriority(v19);
          _InterlockedAnd64((volatile signed __int64 *)(v19 + 24), 0x7FFFFFFFFFFFFFFFui64);
          return 0i64;
        }
        v31 = *(_BYTE *)(v19 + 34);
        if( (v31 & 7) == 2 )
        {
          if( (_DWORD)OperationArgument != 1 )
          {
            if( (v31 & 0x28) == 0 )
            {
              v37 = MiCapturePageFileInfoInline((UINT64 *)(v19 + 16), 1i64, 1i64);
              *a8 = v37;
              if( v37 )
                *OriginalPte = *(_MI_PARTITION **)(qword_140C4E388 + 8 * ((*(_QWORD *)(v19 + 40) >> 39) & 0x3FFi64));
              *(_QWORD *)(v19 + 16) = MiUpdatePageFileHighInPte(*(_QWORD *)(v19 + 16), 1i64) & 0xFFFFFFFFFFFFFFFDui64;
            }
            goto LABEL_94;
          }
          v32 = MI_IS_RESET_PTE(*(_QWORD *)(v19 + 16));
          if( v32 )
            MI_CLEAR_RESET_PTE((MMPTE *)(v19 + 16));
          if( !v32 )
            v8 = -1073740748;
          if( (*(_DWORD *)(v19 + 16) & 4) != 0 )
          {
LABEL_94:
            _InterlockedAnd64((volatile signed __int64 *)(v19 + 24), 0x7FFFFFFFFFFFFFFFui64);
            return v8;
          }
          v33 = *(_BYTE *)(v19 + 34) | 0x10;
          *(_BYTE *)(v19 + 34) = v33;
          if( *(_WORD *)(v19 + 32) )
          {
            *(_BYTE *)(v19 + 34) = v33 & 0xF8 | 3;
            goto LABEL_94;
          }
          v34 = MiUnlinkPageFromList((_MMPFN *)v19, 0i64);
          v35 = (_MMPFN *)v19;
          if( !v34 )
          {
            MiDiscardTransitionPteEx(v19, 0i64);
            v8 = -1073740748;
            goto LABEL_94;
          }
          v36 = 8i64;
        }
        else
        {
          if( (v31 & 7) != 3 )
            goto LABEL_94;
          if( (_DWORD)OperationArgument == 1 )
          {
            v8 = -1073740748;
            goto LABEL_94;
          }
          if( (v31 & 8) != 0 || (_DWORD)OperationArgument || (v31 & 0x20) != 0 )
            goto LABEL_94;
          v38 = v31 & 0xEF;
          *(_BYTE *)(v19 + 34) = v38;
          if( *(_WORD *)(v19 + 32) )
            *(_BYTE *)(v19 + 34) = v38 & 0xF8 | 2;
          else
            MiUnlinkPageFromList((_MMPFN *)v19, 0i64);
          v39 = MiCapturePageFileInfoInline((UINT64 *)(v19 + 16), 1i64, 1i64);
          *a8 = v39;
          if( v39 )
            *OriginalPte = *(_MI_PARTITION **)(qword_140C4E388 + 8 * ((*(_QWORD *)(v19 + 40) >> 39) & 0x3FFi64));
          v48 = MiUpdatePageFileHighInPte(*(_QWORD *)(v19 + 16), 1i64) & 0xFFFFFFFFFFFFFFFDui64;
          *(_QWORD *)(v19 + 16) = v48;
          if( *(_WORD *)(v19 + 32) )
            goto LABEL_94;
          v36 = 4i64;
          v35 = (_MMPFN *)v19;
        }
        MiInsertPageInList(v35, v36);
        goto LABEL_94;
      }
      _InterlockedAnd64((volatile signed __int64 *)(v19 + 24), 0x7FFFFFFFFFFFFFFFui64);
      v12 = v49;
    }
  }
  v40 = OperationArgument;
  if( (_DWORD)OperationArgument == 2 )
    return 0i64;
  if( !v13 )
  {
    if( !v9 && !(_DWORD)OperationArgument )
    {
      v41 = (__int64)(((_QWORD)v10 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
      if( !MiCheckUserVirtualAddress((VOID *)v41, &ProtectCode, (_MMVAD *)rcx0, v14) )
      {
        v42 = ProtectCode;
        if( (_DWORD)ProtectCode != 24 )
        {
          MiUpdatePageTableUseCount((PVOID)v41, 1ui64);
          *(_QWORD *)v10 = (32i64 * (v42 & 0x1F)) | MiSwizzleInvalidPte(0x100000000i64) & 0xFFFFFFFFFFFFFC1Fui64;
          return 0i64;
        }
      }
    }
    return 3221226548i64;
  }
  v43 = *(_MI_PARTITION **)(qword_140C4E388 + 8i64 * *(unsigned __int16 *)(v11 + 1838));
  if( v9 )
  {
    if( v52 == 1 )
    {
      v43 = (_MI_PARTITION *)MiSharedVaToPartition(
                               v11 + 1664,
                               (__int64)(((_QWORD)v10 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16,
                               (UINT64)v9);
    }
    else if( (*(_DWORD *)(rcx0 + 48) & 0x100000) != 0 || (v44 = *(_QWORD *)(rcx0 + 72)) == 0 )
    {
      v43 = *(_MI_PARTITION **)(qword_140C4E388 + 8i64 * *(unsigned __int16 *)(v11 + 1838));
    }
    else
    {
      v43 = *(_MI_PARTITION **)(qword_140C4E388 + 8i64 * (*(_WORD *)(*(_QWORD *)v44 + 60i64) & 0x3FF));
    }
  }
  if( IS_PTE_NOT_DEMAND_ZERO(v15) )
  {
    if( v40 == 1 )
      return 3221226548i64;
    v46 = MiCapturePageFileInfoInline((UINT64 *)&v48, 1i64, 0i64);
    *a8 = v46;
    if( v46 )
    {
      *OriginalPte = v43;
      if( !v9 )
      {
        _InterlockedExchangeAdd64((volatile signed __int64 *)(v11 + 1272), 0xFFFFFFFFFFFFFFFFui64);
        v9 = v10;
      }
      *(_QWORD *)v9 = v48;
    }
  }
  else
  {
    if( v40 == 1 )
    {
      if( !MI_IS_RESET_PTE(v15) )
        return 3221226548i64;
      MI_CLEAR_RESET_PTE((MMPTE *)&v48);
      v45 = v48;
    }
    else
    {
      if( (v15 & 2) != 0 )
      {
        MiReleasePageFileSpace(v43, v15, 1i64);
        v15 &= ~2ui64;
      }
      v45 = MiUpdatePageFileHighInPte(v15, 1i64);
      v48 = v45;
    }
    if( v9 )
      v10 = v9;
    *(_QWORD *)v10 = v45;
  }
  return 0i64;
}

Referenced by:

MiWalkVaRange