MiUnlockNestedPageTableWritePte
VOID __stdcall MiUnlockNestedPageTableWritePte(INT64 a1, INT64 *a2, INT64 a3, INT64 a4){
int v5;
INT64 *v6;
_MMPTE *PxeSelfRef;
int v9;
_MMPTE *NextPteToAge;
int v11;
int v12;
_KLOCK_QUEUE_HANDLE LockHandle;
memset(&LockHandle, 0, sizeof(LockHandle));
v5 = a4;
v6 = a2;
PxeSelfRef = MmGetPxeSelfRef();
if( (_MMPTE *)((char *)MmGetPteBase() + (((unsigned __int64)a2 >> 9) & 0x7FFFFFFFF8i64)) == PxeSelfRef )
{
v9 = 1;
if( !(_DWORD)a4 )
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&stru_140C4DB30 + 522, &LockHandle);
}
else
{
v9 = 0;
}
NextPteToAge = 0i64;
if( (*(_BYTE *)(a1 + 184) & 7) == 0 && v6 >= (INT64 *)MmGetPml4eBase() && v6 <= (INT64 *)MmGetPml4eLimit() )
NextPteToAge = KeGetCurrentThread()->ApcState.Process->Vm.Instance.VmWorkingSetList[15].NextPteToAge;
if( v6 == (INT64 *)PxeSelfRef )
{
MI_INTERLOCKED_EXCHANGE_PTE(v6, a3);
goto LABEL_11;
}
if( NextPteToAge )
{
if( (a3 & 1) != 0 )
goto LABEL_11;
goto LABEL_21;
}
LOBYTE(v11) = MiShouldLockPteDirectly(a1, (UINT64)v6);
if( !v11 )
{
if( (a3 & 1) != 0 )
{
MiWriteValidPteNewProtection(v6, a3);
goto LABEL_11;
}
LABEL_21:
MiPteInShadowRange((UINT64)v6);
*v6 = a3;
goto LABEL_11;
}
_InterlockedExchange64(v6, a3);
LOBYTE(v12) = MiPteInShadowRange((UINT64)v6);
if( v12 )
MiWritePteShadow();
v6 = 0i64;
LABEL_11:
if( v9 && !v5 )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
}
if( v6 )
MiUnlockPageTableInternal(a1, (UINT64)v6);
}Referenced by:
MiClearPteAccessed
MiEvictPageTableLock
MiRewritePteWithLockBit
MiWsleFlush