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