MiLockPageAndSetDirty

VOID __stdcall MiLockPageAndSetDirty(_MMPFN *Pfn1, VOID *WsHeld){
  _MI_PARTITION *v2; 
  UINT8 v4; 
  _MMPTE v5; 
  UINT64 SpinCount; 

  v2 = 0i64;
  if( (_DWORD)WsHeld == 1 )
  {
    LODWORD(SpinCount) = 0;
    v4 = 17;
    while( _interlockedbittestandset64((volatile signed __int32 *)&Pfn1->u2, 0x3Fui64) )
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( Pfn1->u2._bf_0 < 0 );
    }
  }
  else
  {
    v4 = MiLockPageInline(Pfn1);
  }
  MiCaptureDirtyBitToPfn();
  if( v5.u.Long )
    v2 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)Pfn1->u4._bf_0 >> 39) & 0x3FF));
  _InterlockedAnd64(&Pfn1->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
  if( v5.u.Long )
    MiReleasePageFileInfo(v2, v5, 1ui64);
  if( v4 != 17 )
    __writecr8(v4);
}

Referenced by:

MiCopyToUserVa
MiIssueHardFault
MiMakeCombineCandidateClean
MiMakePteClean
MiValidFault
MmSetPageProtection
NtLockVirtualMemory