MiLockPagedAddress
NTSTATUS __stdcall MiLockPagedAddress(VOID *VirtualAddress){
_MMPTE *PteBase;
signed __int64 v3;
_MMPTE v4;
UINT64 v5;
_MMSUPPORT_INSTANCE *AnyMultiplexedVm;
UINT8 v7;
UINT8 v8;
UINT64 v9;
UINT64 v10;
_MMPFN *v11;
NTSTATUS v12;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v13;
char v14;
UINT64 v15;
UINT64 v17;
NTSTATUS v18;
void *v19;
NTSTATUS v20;
UINT64 v21;
UINT64 Flags;
UINT64 SpinCount;
UINT64 v24;
PteBase = MmGetPteBase();
v3 = (signed __int64)PteBase + (((unsigned __int64)VirtualAddress >> 9) & 0x7FFFFFFFF8i64);
v4.u.Long = 0i64;
v5 = (UINT64)PteBase + (((unsigned __int64)v3 >> 9) & 0x7FFFFFFFF8i64);
AnyMultiplexedVm = MiGetAnyMultiplexedVm(MiWorkingSetTypePagedPool, PteBase);
MiLockWorkingSetShared();
v8 = v7;
while( 1 )
{
while( 1 )
{
LODWORD(Flags) = 4;
MiMakeSystemAddressValid((VOID *)v3, 0i64, 0i64, v8, Flags);
LODWORD(v9) = MI_READ_PTE_LOCK_FREE(v3);
v24 = v9;
v10 = v9;
if( (v9 & 1) != 0 )
break;
MiUnlockPageTableInternal((INT64)AnyMultiplexedVm, v5);
LOBYTE(v17) = v8;
MiUnlockWorkingSetShared(AnyMultiplexedVm, v17);
v18 = MmAccessFault(0i64, VirtualAddress, 0, 0i64);
v19 = (void *)v18;
if( v18 < 0 )
{
MiFlushAllFilesystemPages();
KeBugCheckEx(0x7Au, (PVOID)2, v19, 0i64, VirtualAddress);
}
LABEL_18:
MiLockWorkingSetShared();
}
if( (v9 & 0x200) == 0 )
break;
v20 = MiCopyOnWrite(((v3 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16, (INT64 *)v3, 0xFFFFFFFFFFFFFFFFui64, 0i64);
MiUnlockPageTableInternal((INT64)AnyMultiplexedVm, v5);
if( v20 < 0 )
{
LOBYTE(v21) = v8;
MiUnlockWorkingSetShared(AnyMultiplexedVm, v21);
MiCopyOnWriteCheckConditions((INT64)AnyMultiplexedVm, (unsigned int)v20);
goto LABEL_18;
}
}
MiPteInShadowRange((UINT64)&v24);
v11 = &MmGetPfnDb()[(v10 >> 12) & 0xFFFFFFFFFi64];
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v11->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v11->u2._bf_0 < 0 );
}
if( MiAddLockedPageCharge(v11, 0i64) )
{
v12 = 1;
MiCaptureDirtyBitToPfn();
v4.u.Long = v13.Long;
}
else
{
v12 = 0;
}
_InterlockedAnd64(&v11->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
if( v12 )
{
if( v4.u.Long )
MiReleasePageFileInfo(
*(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)v11->u4._bf_0 >> 39) & 0x3FF)),
v4,
1ui64);
v14 = MI_READ_PTE_LOCK_FREE(v3);
if( (v14 & 0x20) == 0 || (v14 & 0x42) == 0 )
MiWriteValidPteVolatile((_MMPTE *)v3, 3ui64);
if( (MiFlags & 0x100) == 0 )
KeFlushSingleTb((UINT64)VirtualAddress, FlushKernel, 1i64);
}
MiUnlockPageTableInternal((INT64)AnyMultiplexedVm, v5);
LOBYTE(v15) = v8;
MiUnlockWorkingSetShared(AnyMultiplexedVm, v15);
return v12;
}Referenced by:
MiLockPagedRange