MiDemoteCombinedPte
NTSTATUS __stdcall MiDemoteCombinedPte(_MMSUPPORT_INSTANCE *Vm, _MMPTE *PointerPte, _MMPTE *ProtoPte){
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;} v3;
bool v6;
_MMPTE *v7;
unsigned __int64 v8;
_MMPFN *v9;
__int64 v10;
__int64 v11;
_EPROCESS *Process;
char WsleContents;
__int64 v14;
unsigned __int64 v15;
UINT8 v16;
UINT64 v17;
unsigned __int16 ReferenceCount;
unsigned __int64 v19;
__int64 bf_0;
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;} v22;
_MMPFN *PfnDb;
_MMPFN *v24;
int v25;
__int64 v26;
__int64 v27;
INT64 Long;
__int64 v29;
unsigned __int64 v30;
VOID *Va;
_MMSUPPORT_INSTANCE *Vma;
_MMPTE *ProtoPtea;
_MMPFN_IDENTITY PfnIdentity[4];
__int64 v35;
__int64 v36[2];
v3.Long = (unsigned __int64)PointerPte->u;
ProtoPtea = ProtoPte;
*(_OWORD *)PfnIdentity = 0i64;
v35 = 0i64;
Vma = Vm;
v6 = ProtoPte[-2].u.Long <= 1;
v7 = ProtoPte - 6;
Long = v3.Long;
if( !v6 )
return 0;
v26 = *(_QWORD *)(((unsigned __int64)v7 & 0xFFFFFFFFFFFFF000ui64) + 0x10);
LODWORD(v8) = MI_READ_PTE_LOCK_FREE((INT64)&Long);
v9 = &MmGetPfnDb()[(v8 >> 12) & 0xFFFFFFFFFi64];
v10 = ((unsigned __int64)v9->u4._bf_0 >> 39) & 0x3FF;
v11 = (__int64)(((_QWORD)PointerPte << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
Va = (VOID *)v11;
v29 = *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8 * v10);
Process = 0i64;
if( (Vm->Flags._bf_0 & 7) == 0 )
{
Process = KeGetCurrentThread()->ApcState.Process;
if( Process->ForkInProgress )
return 0;
}
WsleContents = MiGetWsleContents(v10, v11);
LODWORD(v15) = MI_READ_PTE_LOCK_FREE(v14 + (((unsigned __int64)PointerPte >> 9) & 0x7FFFFFFFF8i64));
v30 = v15 >> 12;
v25 = *(&PerfGlobalGroupMask + 1) & 0x8000001;
v16 = MiLockPageInline(v9);
ReferenceCount = v9->u3.ReferenceCount;
v19 = v16;
if( (ReferenceCount == 1 || ReferenceCount == 2 && (*(_BYTE *)(&v9->u3 + 1) & 8) != 0)
&& *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8i64 * Vm->PartitionId) == v29
&& _InterlockedCompareExchange64((volatile signed __int64 *)&v7[4], 0i64, 1i64) == 1 )
{
_InterlockedExchangeAdd((volatile signed __int32 *)(v26 + 392), 0xFFFFFFFF);
bf_0 = v9->u4._bf_0;
v9->PteLong = (unsigned __int64)PointerPte;
v27 = bf_0 & 0xFFFFFFFFFi64;
v22.Long = (unsigned __int64)v9->OriginalPte.u;
v9->u4._bf_0 = v30 & 0xFFFFFFFFFi64 | bf_0 & 0x7FFFFFF000000000i64;
if( ((v22.Long >> 5) & 5) == 5 )
v9->OriginalPte.u.Long = v22.Long ^ (LOWORD(v22.Long) ^ (unsigned __int16)(32 * ((v22.Long >> 5) & 0xFFFE))) & 0x3E0;
if( v25 )
MiIdentifyPfn(v9, PfnIdentity);
_InterlockedAnd64(&v9->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v19);
if( (v3.Long & 0x200) != 0 )
{
Long = v3.Long & 0xFFFFFFFFFFFFF5DFui64 | 0x820;
MiWriteValidPteNewProtection((INT64 *)PointerPte, Long);
}
PfnDb = MmGetPfnDb();
v24 = &PfnDb[v27];
if( (WsleContents & 0xF) == 8 )
MiUnlockPageTableCharges((_DWORD)PfnDb + 48 * v27, 1u, v17);
MiLockAndDecrementShareCount(v24, 0i64);
MiUpdateWorkingSetPrivateSize(Vma, Va, 1i64);
if( Process )
_InterlockedExchangeAdd64((volatile signed __int64 *)&Process->NumberOfPrivatePages, 1ui64);
if( v25 )
{
MiLogCombinedPteDelete(ProtoPtea);
v36[1] = 24i64;
v36[0] = (__int64)PfnIdentity;
EtwTraceKernelEvent((__int64)v36, 1u, 0x28000001u, 0x276u, 0x11401B02u);
}
MiFreeCombineBlock((_MI_COMBINE_BLOCK *)v7);
return 1;
}
else
{
_InterlockedAnd64(&v9->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v16);
return 0;
}
}Referenced by:
MiActOnPte
MiAgePte
MiDeprioritizeVirtualAddresses
MiResetAccessBitPte
MiTrimPte
MiWalkVaCheckCommon
NtUnlockVirtualMemory