MiPreUnlockWorkingSetShared
VOID __stdcall MiPreUnlockWorkingSetShared(_MMSUPPORT_INSTANCE *Vm, UINT8 a2){
_ETHREAD *CurrentThread;
__int8 bf_0;
_MMSUPPORT_SHARED *v6;
__int64 v7;
unsigned __int64 WorkingSetLeafSize;
unsigned __int64 MaximumWorkingSetSize;
_MMSUPPORT_SHARED *SharedVm;
_KLOCK_QUEUE_HANDLE LockQueue;
memset(&LockQueue, 0, sizeof(LockQueue));
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( (CurrentThread->CrossThreadFlags & 0x400000) == 0 )
{
if( (Vm->Flags._bf_0 & 8) != 0 )
{
LockQueue.LockQueue.Next = 0i64;
LockQueue.LockQueue.Lock = &MiGetSharedVm(Vm)->WorkingSetCoreLock;
KxAcquireQueuedSpinLock(&LockQueue.LockQueue, LockQueue.LockQueue.Lock);
Vm->Flags._bf_0 &= ~8u;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
_interlockedbittestandset((volatile signed __int32 *)&CurrentThread->1296, 0x16u);
LODWORD(v7) = MiForcedTrim(Vm);
if( !v7 && (Vm->Flags._bf_0 & 0x40) != 0 )
{
WorkingSetLeafSize = Vm->WorkingSetLeafSize;
if( WorkingSetLeafSize > Vm->MaximumWorkingSetSize )
{
if( (Vm->PageFaultCount & 0xF) != 0 )
MaximumWorkingSetSize = WorkingSetLeafSize - 1;
else
MaximumWorkingSetSize = Vm->MaximumWorkingSetSize;
MiReduceWs(Vm, a2, MaximumWorkingSetSize);
}
}
}
bf_0 = Vm->Flags._bf_0;
if( (bf_0 & 4) != 0 )
{
SharedVm = MiGetSharedVm(Vm);
LockQueue.LockQueue.Next = 0i64;
LockQueue.LockQueue.Lock = &SharedVm->WorkingSetCoreLock;
KxAcquireQueuedSpinLock(&LockQueue.LockQueue, &SharedVm->WorkingSetCoreLock);
Vm->Flags._bf_0 &= ~4u;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
_interlockedbittestandset((volatile signed __int32 *)&CurrentThread->1296, 0x16u);
MiForceAgeWorkingSet(Vm, a2);
bf_0 = Vm->Flags._bf_0;
}
if( (bf_0 & 0x10) != 0 )
{
v6 = MiGetSharedVm(Vm);
LockQueue.LockQueue.Next = 0i64;
LockQueue.LockQueue.Lock = &v6->WorkingSetCoreLock;
KxAcquireQueuedSpinLock(&LockQueue.LockQueue, &v6->WorkingSetCoreLock);
Vm->Flags._bf_0 &= ~0x10u;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
_interlockedbittestandset((volatile signed __int32 *)&CurrentThread->1296, 0x16u);
MiReduceWs(Vm, a2, Vm->MaximumWorkingSetSize);
}
if( (CurrentThread->CrossThreadFlags & 0x400000) != 0 )
_interlockedbittestandreset((volatile signed __int32 *)&CurrentThread->1296, 0x16u);
}
}Referenced by:
MiDeletePagablePteRange
MiMoveDirtyBitsToPfns
MiTrimOrAgeWorkingSet
MiUnlockWorkingSetShared