MmSetAddressRangeModifiedEx
NTSTATUS __stdcall MmSetAddressRangeModifiedEx(UINT64 a1, INT64 a2){
INT64 v2;
int v4;
_MMPTE *PteBase;
INT64 *v6;
unsigned __int64 v7;
char *v8;
INT64 v9;
__int64 v10;
__int64 v11;
unsigned __int64 v12;
__int64 v13;
UINT64 v14;
UINT64 v15;
int v16;
int v17;
_MMPTE v18;
int v19;
_MMPFN *v20;
unsigned __int8 CurrentIrql;
bool v22;
_MI_PARTITION *v23;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v24;
int v26;
__int64 v27;
unsigned __int64 v28;
unsigned __int8 v29;
char v30[3];
int v31;
UINT64 v32;
UINT64 SpinCount;
int v34;
_MI_PARTITION *Partition;
UINT64 v36;
INT64 v37;
_MI_TB_FLUSH_LIST TbFlushList;
__int16 v39;
__int16 v40;
__int64 v41;
__int64 v42;
__int64 v43;
char v44[152];
v2 = a2 - 1;
v30[0] = 0;
v40 = 0;
memset(v44, 0i64, sizeof(v44));
v29 = 0;
HIDWORD(SpinCount) = MiMakeProtectionMask(4ui64);
v41 = 20i64;
v4 = HIDWORD(SpinCount);
TbFlushList = 0;
v39 = 0;
v42 = 0i64;
v43 = 0i64;
PteBase = MmGetPteBase();
v6 = (INT64 *)((char *)PteBase + ((a1 >> 9) & 0x7FFFFFFFF8i64));
v7 = (unsigned __int64)PteBase + (((a1 + v2) >> 9) & 0x7FFFFFFFF8i64);
v8 = (char *)(a1 & 0xFFFFFFFFFFFFF000ui64);
v9 = 0i64;
v36 = (UINT64)MiLockWorkingSetOptimal((INT64)&stru_140C50B28 + 7128, (UINT64)v6, v30);
LODWORD(v10) = MiGetSystemCacheReverseMap((UINT64)v8);
v11 = *(_QWORD *)(v10 + 24);
v12 = v11 & 0xFFFFFFFFFFFFFFFEui64;
if( (v11 & 1) == 0 )
v12 = *(_QWORD *)(v10 + 24);
v13 = *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8i64 * (*(_WORD *)(*(_QWORD *)v12 + 60i64) & 0x3FF));
v14 = (UINT64)v6;
v37 = v13 + 7232;
do
{
v15 = *v6;
LOBYTE(v16) = MiPteInShadowRange(v14);
v17 = v16;
v32 = v15;
if( (v15 & 1) != 0 )
{
v34 = 0;
v18.u.Long = 0i64;
LOBYTE(v19) = MiPteInShadowRange((UINT64)&v32);
v31 = v19;
v20 = &MmGetPfnDb()[(v15 >> 12) & 0xFFFFFFFFFi64];
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v20->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v20->u2._bf_0 < 0 );
}
v22 = (*(_BYTE *)(&v20->u3 + 1) & 0x10) == 0;
v23 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)v20->u4._bf_0 >> 39) & 0x3FF));
Partition = v23;
if( v22 || (*(_DWORD *)(&v20->3 + 1) & 0x400i64) == 0 )
{
MiCaptureDirtyBitToPfn();
v18.u.Long = v24.Long;
v23 = Partition;
}
_InterlockedAnd64(&v20->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(CurrentIrql);
if( v18.u.Long )
MiReleasePageFileInfo(v23, v18, 0i64);
v4 = HIDWORD(SpinCount);
if( HIDWORD(SpinCount) != 2 || (v15 & 0x800) == 0 )
{
if( (v15 & 0x42) == 0 )
goto LABEL_14;
MiWriteValidPteNewProtection(v6, v15 & 0xFFFFFFFFFFFFFFBDui64);
v29 = 1;
LABEL_13:
MiInsertTbFlushEntry(&TbFlushList, v8, 1ui64, 0i64);
goto LABEL_14;
}
v9 ^= (v9 ^ v15) & 0xFFFFFFFFF000i64;
MiWriteValidPteNewProtection(v6, v9);
if( ((MiFlags & 0x100) != 0 || (MiFlags & 0x200) != 0) && !MI_TIGHTER_PERMISSIONS((_MMPTE)v15, (_MMPTE)v9) )
v26 = v34;
else
v26 = 1;
if( (v15 & 0x42) != 0 )
v29 = 1;
if( v26 )
goto LABEL_13;
}
else if( v4 == 2 && (v15 & 8) == 0 )
{
v27 = v15 | 8;
v32 = v27;
v28 = v27;
if( v17 )
{
v28 = v27;
if( (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v27 & 1) != 0 )
v28 = v27 | 0x8000000000000000ui64;
}
*v6 = v28;
}
LABEL_14:
++v6;
v8 += 4096;
v14 = (UINT64)v6;
}
while( (unsigned __int64)v6 <= v7 );
MiFlushTbList(&TbFlushList);
MiUnlockPageTableInternal(v37, v36);
MiUnlockWorkingSetShared((_MMSUPPORT_INSTANCE *)v37, (unsigned __int8)v30[0]);
return v29;
}Referenced by:
CcFlushCachePriv
CcPurgeAndClearCacheSection
CcUnpinRepinnedBcb
CcZeroDataInCache
MmSetAddressRangeModified