MiReplicatePteChange
VOID __stdcall MiReplicatePteChange(MMPTE *PointerPte, MMPTE *LastPte){
_MMPTE *PteBase;
UINT64 v4;
__int64 v5;
__int64 v6;
UINT64 LeafVa;
__int64 v8;
__int64 *v9;
__int64 *i;
INT64 v11;
int v12;
struct _KLOCK_QUEUE_HANDLE LockHandle;
PteBase = MmGetPteBase();
memset(&LockHandle, 0, sizeof(LockHandle));
v4 = (UINT64)PointerPte;
v5 = 3i64;
do
{
v4 = (UINT64)PteBase + ((v4 >> 9) & 0x7FFFFFFFF8i64);
LastPte = (_MMPTE *)((char *)PteBase + (((unsigned __int64)LastPte >> 9) & 0x7FFFFFFFF8i64));
--v5;
}
while( v5 );
v6 = *((_QWORD *)KeGetCurrentThread() + 23);
LeafVa = MiGetLeafVa((UINT64)PointerPte);
if( (unsigned int)MiGetSystemRegionType(LeafVa) == 1 )
{
v8 = *(_QWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1368i64);
v9 = (__int64 *)(v8 + 16);
}
else
{
v8 = 0i64;
v9 = &qword_140C4DB68;
}
KeAcquireInStackQueuedSpinLock(&WorkerRoutine, &LockHandle);
for( i = (__int64 *)*v9; i != v9; i = (__int64 *)*i )
{
v11 = (INT64)i + (v8 != 0 ? -1184i64 : -1984i64);
v12 = *(_DWORD *)(v11 + 1124);
if( (v12 & 0x800000) == 0 )
{
if( (v12 & 0xC00) != 0 && (v12 & 0x80u) == 0 )
{
if( v11 != v6 )
MiReplicatePteChangeToProcess(v11, v4, (UINT64)LastPte);
}
else
{
_InterlockedOr((volatile signed __int32 *)(v11 + 1124), 0x800000u);
}
}
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
}Referenced by:
MiCreateSystemPageTable
MiDecommitLargePoolVa
MiDeleteSystemPageTable
MiDeleteVaTail
MiInitializeShadowPageTable
MiReplicatePfnDatabaseMappings
MiZeroAndFlushPtes