MiLockDownWorkingSet
VOID __stdcall MiLockDownWorkingSet(ULONG_PTR ProcessToInitialize, UINT64 Lock){
int v2;
_MMSUPPORT_INSTANCE *v3;
_MMSUPPORT_SHARED *SharedVm;
UINT8 v5;
UINT8 v6;
_MMPTE *PxeSelfRef;
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;} v8;
_MMPFN *v9;
UINT64 SpinCount;
_KAPC_STATE ApcState;
v2 = Lock;
v3 = (_MMSUPPORT_INSTANCE *)(*(_QWORD *)&ProcessToInitialize + 1664i64);
memset(&ApcState, 0, sizeof(ApcState));
KiStackAttachProcess(*(PVOID *)&ProcessToInitialize, 0i64, &ApcState);
SharedVm = MiGetSharedVm(v3);
v5 = ExAcquireSpinLockExclusive((INT64 *)&SharedVm->WorkingSetLock);
SharedVm->GoodCitizenWaiting = 0;
v6 = v5;
PxeSelfRef = MmGetPxeSelfRef();
v8.Long = (unsigned __int64)PxeSelfRef->u;
MiPteInShadowRange((UINT64)PxeSelfRef);
v9 = &MmGetPfnDb()[(v8.Long >> 12) & 0xFFFFFFFFFi64];
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v9->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v9->u2._bf_0 < 0 );
}
if( v2 == 1 )
MiAddLockedPageCharge(v9, 1ui64);
else
MiRemoveLockedPageChargeAndDecRef(v9);
_InterlockedAnd64(&v9->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
MiUnlockWorkingSetExclusive(v3, v6);
KiUnstackDetachProcess(&ApcState, 0i64);
}Referenced by:
MiCloneProcessAddressSpace