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