MmSetAddressRangeModifiedEx
INT64 __fastcall MmSetAddressRangeModifiedEx(UINT64 rcx0, INT64 a2){
INT64 v2;
int v4;
_MMPTE *PteBase;
INT64 *v6;
unsigned __int64 v7;
UINT64 v8;
INT64 v9;
unsigned __int64 v10;
unsigned __int64 v11;
__int64 v12;
UINT64 v13;
unsigned __int64 v14;
BOOL v15;
UINT64 v16;
INT64 v17;
char *v18;
unsigned __int8 CurrentIrql;
bool v20;
INT64 v21;
int v23;
__int64 v24;
unsigned __int64 v25;
INT64 a5;
UINT64 v27;
UINT64 SpinCount;
INT64 a8;
INT64 a1;
UINT64 v31;
INT64 a11;
INT64 v33;
INT64 v34[4];
INT64 result[20];
v2 = a2 - 1;
memset((INT64)result, 0i64);
LOWORD(a5) = 0;
HIDWORD(SpinCount) = MiMakeProtectionMask(4ui64);
v34[1] = 20i64;
v4 = HIDWORD(SpinCount);
v34[0] = 0i64;
v34[2] = 0i64;
v34[3] = 0i64;
PteBase = MmGetPteBase();
v6 = (INT64 *)((char *)PteBase + ((rcx0 >> 9) & 0x7FFFFFFFF8i64));
v7 = (unsigned __int64)PteBase + (((rcx0 + v2) >> 9) & 0x7FFFFFFFF8i64);
v8 = rcx0 & 0xFFFFFFFFFFFFF000ui64;
v9 = 0i64;
v31 = (UINT64)MiLockWorkingSetOptimal((INT64)&qword_140C52700, (UINT64)v6, (BYTE *)&a5 + 1);
v10 = *(_QWORD *)(MiGetSystemCacheReverseMap(v8) + 24);
v11 = v10 & 0xFFFFFFFFFFFFFFFEui64;
if( (v10 & 1) == 0 )
v11 = v10;
v12 = *(_QWORD *)(qword_140C4E388 + 8i64 * (*(_WORD *)(*(_QWORD *)v11 + 60i64) & 0x3FF));
v13 = (UINT64)v6;
a11 = v12 + 7232;
do
{
v14 = *v6;
v15 = MiPteInShadowRange(v13);
v27 = v14;
if( (v14 & 1) != 0 )
{
LODWORD(a8) = 0;
v16 = 0i64;
HIDWORD(a5) = MiPteInShadowRange((UINT64)&v27);
v18 = (char *)MmGetPfnDb() + 48 * ((v14 >> 12) & 0xFFFFFFFFFi64);
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v18 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((__int64 *)v18 + 3) < 0 );
}
v20 = (v18[34] & 0x10) == 0;
v21 = *(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v18 + 5) >> 39) & 0x3FFi64));
a1 = v21;
if( v20 || (*((_DWORD *)v18 + 4) & 0x400i64) == 0 )
{
v16 = MiCaptureDirtyBitToPfn((INT64)v18);
v21 = a1;
}
_InterlockedAnd64((volatile signed __int64 *)v18 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(CurrentIrql);
if( v16 )
MiReleasePageFileInfo(v21, v16, 0, v17, a5, v27, SpinCount, a8, a1, v31, a11, v33);
v4 = HIDWORD(SpinCount);
if( HIDWORD(SpinCount) != 2 || (v14 & 0x800) == 0 )
{
if( (v14 & 0x42) == 0 )
goto LABEL_14;
MiWriteValidPteNewProtection(v6, v14 & 0xFFFFFFFFFFFFFFBDui64);
LOBYTE(a5) = 1;
LABEL_13:
MiInsertTbFlushEntry((INT64)v34, v8, 1i64, 0i64);
goto LABEL_14;
}
v9 ^= (v9 ^ v14) & 0xFFFFFFFFF000i64;
MiWriteValidPteNewProtection(v6, v9);
if( ((MiFlags & 0x100) != 0 || (MiFlags & 0x200) != 0) && !MI_TIGHTER_PERMISSIONS(v14, v9) )
v23 = a8;
else
v23 = 1;
if( (v14 & 0x42) != 0 )
LOBYTE(a5) = 1;
if( v23 )
goto LABEL_13;
}
else if( v4 == 2 && (v14 & 8) == 0 )
{
v24 = v14 | 8;
v27 = v24;
v25 = v24;
if( v15 )
{
v25 = v24;
if( (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0 && (v24 & 1) != 0 )
v25 = v24 | 0x8000000000000000ui64;
}
*v6 = v25;
}
LABEL_14:
++v6;
v8 += 4096i64;
v13 = (UINT64)v6;
}
while( (unsigned __int64)v6 <= v7 );
MiFlushTbList((__int64)v34);
MiUnlockPageTableInternal(a11, v31);
MiUnlockWorkingSetShared(a11, BYTE1(a5));
return(unsigned __int8)a5;
}Referenced by:
CcFlushCachePriv
CcPurgeAndClearCacheSection
CcUnpinRepinnedBcb
CcZeroDataInCache
MmSetAddressRangeModified