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