MiDemoteCombinedPte
INT64 __fastcall MiDemoteCombinedPte(_MMSUPPORT_INSTANCE *Vm, _MMPTE *PoINTerPte, _MMPTE *ProtoPte){
INT64 v3;
bool v6;
INT64 v7;
char *v8;
__int64 v9;
__int64 v10;
__int64 v11;
char WsleContents;
__int64 v13;
unsigned __int8 v14;
UINT64 v15;
__int16 v16;
unsigned __int64 v17;
__int64 v19;
unsigned __int64 v20;
_MMPFN *PfnDb;
UINT64 v22;
UINT64 Flag;
int v24;
__int64 v25;
__int64 v26;
INT64 v27;
__int64 v28;
unsigned __int64 v29;
UINT64 v30;
INT64 v31;
MMPTE *ProtoPtea;
UINT64 a2[2];
__int64 v34;
EVENT_DATA_DESCRIPTOR EventData;
v3 = *(_QWORD *)PoINTerPte;
ProtoPtea = ProtoPte;
*(_OWORD *)a2 = 0i64;
v34 = 0i64;
v31 = (INT64)Vm;
v6 = *((_QWORD *)ProtoPte - 2) <= 1ui64;
v7 = (INT64)ProtoPte - 48;
v27 = v3;
if( !v6 )
return 0i64;
v25 = *(_QWORD *)((v7 & 0xFFFFFFFFFFFFF000ui64) + 0x10);
v8 = (char *)MmGetPfnDb() + 48 * (((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&v27) >> 12) & 0xFFFFFFFFFi64);
v9 = (*((_QWORD *)v8 + 5) >> 39) & 0x3FFi64;
v10 = (__int64)(((_QWORD)PoINTerPte << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
v30 = v10;
v28 = *(_QWORD *)(qword_140C4E388 + 8 * v9);
v11 = 0i64;
if( (*(_BYTE *)&Vm->Flags.0 & 7) == 0 )
{
v11 = *((_QWORD *)KeGetCurrentThread() + 23);
if( *(_QWORD *)(v11 + 1248) )
return 0i64;
}
WsleContents = MiGetWsleContents(v9, v10);
v29 = (unsigned __int64)MI_READ_PTE_LOCK_FREE(v13 + (((unsigned __int64)PoINTerPte >> 9) & 0x7FFFFFFFF8i64)) >> 12;
v24 = HIDWORD(PerfGlobalGroupMask) & 0x8000001;
v14 = MiLockPageInline((INT64)v8);
v16 = *((_WORD *)v8 + 16);
v17 = v14;
if( (v16 == 1 || v16 == 2 && (v8[34] & 8) != 0)
&& *(_QWORD *)(qword_140C4E388 + 8i64 * Vm->PartitionId) == v28
&& _InterlockedCompareExchange64((volatile signed __int64 *)(v7 + 32), 0i64, 1i64) == 1 )
{
_InterlockedExchangeAdd((volatile signed __int32 *)(v25 + 392), 0xFFFFFFFF);
v19 = *((_QWORD *)v8 + 5);
*((_QWORD *)v8 + 1) = PoINTerPte;
v26 = v19 & 0xFFFFFFFFFi64;
v20 = *((_QWORD *)v8 + 2);
*((_QWORD *)v8 + 5) = v29 & 0xFFFFFFFFFi64 | v19 & 0x7FFFFFF000000000i64;
if( ((v20 >> 5) & 5) == 5 )
*((_QWORD *)v8 + 2) = v20 ^ ((unsigned __int16)v20 ^ (unsigned __int16)(32 * ((v20 >> 5) & 0xFFFE))) & 0x3E0;
if( v24 )
MiIdentifyPfn((_MMPFN *)v8, a2);
_InterlockedAnd64((volatile signed __int64 *)v8 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v17);
if( (v3 & 0x200) != 0 )
{
v27 = v3 & 0xFFFFFFFFFFFFF5DFui64 | 0x820;
MiWriteValidPteNewProtection((INT64 *)PoINTerPte, v27);
}
PfnDb = MmGetPfnDb();
v22 = (UINT64)PfnDb + 48 * v26;
if( (WsleContents & 0xF) == 8 )
MiUnlockPageTableCharges((_MMPFN *)((char *)PfnDb + 48 * v26), 1u, v15);
MiLockAndDecrementShareCount(v22, 0);
MiUpdateWorkingSetPrivateSize(v31, v30, 1i64, 0i64);
if( v11 )
_InterlockedExchangeAdd64((volatile signed __int64 *)(v11 + 1272), 1ui64);
if( v24 )
{
MiLogCombinedPteDelete(ProtoPtea);
*(_QWORD *)&EventData.Size = 24i64;
EventData.Ptr = (unsigned __int64)a2;
LODWORD(Flag) = 289413890;
EtwTraceKernelEvent(&EventData, 1ui64, 0x28000001ui64, 0x276u, Flag);
}
MiFreeCombineBlock(v7);
return 1i64;
}
else
{
_InterlockedAnd64((volatile signed __int64 *)v8 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v14);
return 0i64;
}
}Referenced by:
MiActOnPte
MiAgePte
MiDeprioritizeVirtualAddresses
MiResetAccessBitPte
MiTrimPte
MiWalkVaCheckCommon
NtUnlockVirtualMemory