MiUpdatePfnProtection
NTSTATUS __stdcall MiUpdatePfnProtection(_MMVAD_SHORT *Vad, _MMPFN *Pfn1, UINT64 ProtectionMask){
unsigned int v3;
__int64 v6;
NTSTATUS v7;
NTSTATUS v8;
__int64 v9;
UINT64 SpinCount;
LODWORD(SpinCount) = 0;
v3 = ProtectionMask;
while( _interlockedbittestandset64((volatile signed __int32 *)&Pfn1->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( Pfn1->u2._bf_0 < 0 );
}
MiSanitizePfnProtection(Vad, (Pfn1->OriginalPte.u.Long >> 5) & 0x1F, v3);
v8 = v7;
v9 = 32i64 * (v7 & 0x1F);
if( v6 )
Pfn1->OriginalPte.u.Long = v9 | v6 & 0xFFFFFFFFFFFFFC1Fui64;
else
Pfn1->OriginalPte.u.Long = MiSwizzleInvalidPte(v9);
_InterlockedAnd64(&Pfn1->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
return v8;
}Referenced by:
MiMakeVaRangeNoAccess
MiProtectPrivateMemory
MiSetReadOnlyOnSectionView