MiPreUnlockWorkingSetShared
CHAR __fastcall MiPreUnlockWorkingSetShared(INT64 a1, CHAR a2){
CHAR result;
_ETHREAD *CurrentThread;
INT64 *v6;
WORK_QUEUE_TYPE v7;
PVOID v8;
INT64 v9;
INT64 *v10;
WORK_QUEUE_TYPE v11;
PVOID v12;
INT64 v13;
INT64 *v14;
unsigned __int64 v15;
INT64 v16;
INT64 *SharedVm;
WORK_QUEUE_TYPE v18;
PVOID v19;
struct _KLOCK_QUEUE_HANDLE LockHandle;
result = 0;
memset(&LockHandle, 0, sizeof(LockHandle));
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( (*((_DWORD *)CurrentThread + 324) & 0x400000) == 0 )
{
if( (*(_BYTE *)(a1 + 187) & 8) != 0 )
{
LockHandle.LockQueue.Next = 0i64;
LockHandle.LockQueue.Lock = (unsigned __int64 *volatile)(MiGetSharedVm(a1) + 8);
KxAcquireQueuedSpinLock((PIO_WORKITEM)&LockHandle, (PIO_WORKITEM_ROUTINE)LockHandle.LockQueue.Lock, v11, v12);
*(_BYTE *)(a1 + 187) &= ~8u;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
_interlockedbittestandset((volatile signed __int32 *)CurrentThread + 324, 0x16u);
if( !MiForcedTrim((_MMSUPPORT_INSTANCE *)a1) && (*(_BYTE *)(a1 + 184) & 0x40) != 0 )
{
v15 = *(_QWORD *)(a1 + 120);
if( v15 > *(_QWORD *)(a1 + 152) )
{
LOBYTE(v13) = a2;
if( (*(_DWORD *)(a1 + 4) & 0xF) != 0 )
v16 = v15 - 1;
else
v16 = *(_QWORD *)(a1 + 152);
MiReduceWs(a1, v13, v16, v14);
}
}
}
result = *(_BYTE *)(a1 + 187);
if( (result & 4) != 0 )
{
SharedVm = MiGetSharedVm(a1);
LockHandle.LockQueue.Next = 0i64;
LockHandle.LockQueue.Lock = (unsigned __int64 *volatile)(SharedVm + 8);
KxAcquireQueuedSpinLock((PIO_WORKITEM)&LockHandle, (PIO_WORKITEM_ROUTINE)(SharedVm + 8), v18, v19);
*(_BYTE *)(a1 + 187) &= ~4u;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
_interlockedbittestandset((volatile signed __int32 *)CurrentThread + 324, 0x16u);
MiForceAgeWorkingSet(a1, a2);
result = *(_BYTE *)(a1 + 187);
}
if( (result & 0x10) != 0 )
{
v6 = MiGetSharedVm(a1);
LockHandle.LockQueue.Next = 0i64;
LockHandle.LockQueue.Lock = (unsigned __int64 *volatile)(v6 + 8);
KxAcquireQueuedSpinLock((PIO_WORKITEM)&LockHandle, (PIO_WORKITEM_ROUTINE)(v6 + 8), v7, v8);
*(_BYTE *)(a1 + 187) &= ~0x10u;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
_interlockedbittestandset((volatile signed __int32 *)CurrentThread + 324, 0x16u);
LOBYTE(v9) = a2;
result = MiReduceWs(a1, v9, *(_QWORD *)(a1 + 152), v10);
}
if( (*((_DWORD *)CurrentThread + 324) & 0x400000) != 0 )
_interlockedbittestandreset((volatile signed __int32 *)CurrentThread + 324, 0x16u);
}
return result;
}Referenced by:
MiDeletePagablePteRange
MiMoveDirtyBitsToPfns
MiTrimOrAgeWorkingSet
MiUnlockWorkingSetShared