MiRemoveLowestPriorityStandbyPage
UINT64 __stdcall MiRemoveLowestPriorityStandbyPage(_MI_PARTITION *Partition, UINT64 HighestPriority, UINT64 Flags){
void *v3;
_QWORD *v4;
unsigned __int64 v5;
_LIST_ENTRY *v6;
__int64 v7;
unsigned __int8 CurrentIrql;
unsigned __int64 v9;
char *v10;
__int64 v11;
unsigned __int64 v12;
INT64 v13;
__int64 v14;
unsigned __int64 v15;
__int64 v16;
int v17;
unsigned __int64 v19;
unsigned __int64 v20;
volatile signed __int32 *v21;
unsigned int v22;
unsigned __int64 v23;
int v24;
__int64 v25;
INT64 v26;
__int64 v27;
__int64 v28;
INT64 updated;
__int64 v30;
__int64 v31;
__int64 v32;
UINT64 v33;
int v34;
WCHAR *v35;
UNICODE_STRING *v36;
unsigned __int64 v37;
int v38;
__int64 v39;
char v40;
char v41;
char v42;
ULONG_PTR AvailablePagesExcludeSlists;
struct _IO_WORKITEM LockHandle;
UINT64 SpinCount;
UINT64 Flagsa;
unsigned __int64 v48;
LODWORD(Flagsa) = Flags;
v4 = (_QWORD *)((char *)Partition + 2432);
memset(&LockHandle, 0, 24);
v48 = (unsigned __int64)Partition + 32 * (unsigned int)HighestPriority + 8 * (unsigned int)HighestPriority + 2432;
if( (unsigned __int64)Partition + 2432 >= v48 )
return -1i64;
v5 = v48;
v6 = (_LIST_ENTRY *)((char *)Partition + 2464);
v7 = 0xFFFFFFFFFi64;
while( v4[2] == 0xFFFFFFFFFi64 )
{
LABEL_40:
v4 += 5;
v6 = (_LIST_ENTRY *)((char *)v6 + 40);
if( (unsigned __int64)v4 >= v5 )
return -1i64;
}
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LockHandle.WorkItem.List.Blink = v6;
LockHandle.WorkItem.List.Flink = 0i64;
KxAcquireQueuedSpinLock(&LockHandle, (PIO_WORKITEM_ROUTINE)v6, (WORK_QUEUE_TYPE)Flags, v3);
v9 = v4[2];
if( v9 == 0xFFFFFFFFFi64 )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
LABEL_39:
__writecr8(CurrentIrql);
v5 = v48;
goto LABEL_40;
}
v10 = (char *)MmGetPfnDb() + 48 * v9;
if( (unsigned int)MiIsDecayPfn(v4[2]) == 1 )
{
v7 = v9;
v12 = *((_QWORD *)v10 + 2);
v13 = (INT64)v10;
if( qword_140C4DC80 && (v12 & 0x10) == 0 )
v12 &= ~qword_140C4DC80;
v9 = (v12 >> 12) & 0xFFFFFFFFFi64;
v10 = (char *)(v11 + 48 * v9);
if( v9 == v7 )
{
MiUnlinkPageFromList((_MMPFN *)v13, 1ui64);
*(_BYTE *)(v13 + 35) &= ~8u;
MiRemoveDecayClusterTimer(v13);
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
LABEL_12:
v7 = 0xFFFFFFFFFi64;
LABEL_38:
v4 -= 5;
v6 = (_LIST_ENTRY *)((char *)v6 - 40);
goto LABEL_39;
}
}
else
{
v13 = 0i64;
}
if( !_interlockedbittestandset64((volatile signed __int32 *)v10 + 6, 0x3Fui64) )
{
v7 = 0xFFFFFFFFFi64;
goto LABEL_33;
}
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v10 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((__int64 *)v10 + 3) < 0 );
}
if( (v10[34] & 7) != 2
|| *(_MI_PARTITION **)(qword_140C4E388 + 8 * ((*((_QWORD *)v10 + 5) >> 39) & 0x3FFi64)) != Partition )
{
goto LABEL_30;
}
LockHandle.WorkItem.List.Blink = v6;
LockHandle.WorkItem.List.Flink = 0i64;
KxAcquireQueuedSpinLock(&LockHandle, (PIO_WORKITEM_ROUTINE)v6, (WORK_QUEUE_TYPE)Flags, v3);
v14 = v4[2];
if( !v13 )
{
if( v9 == v14 )
{
v7 = 0xFFFFFFFFFi64;
goto LABEL_33;
}
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
LABEL_30:
_InterlockedAnd64((volatile signed __int64 *)v10 + 3, 0x7FFFFFFFFFFFFFFFui64);
goto LABEL_12;
}
if( v7 != v14 )
{
v7 = 0xFFFFFFFFFi64;
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
goto LABEL_37;
}
v15 = *(_QWORD *)(v13 + 16);
if( qword_140C4DC80 && (v15 & 0x10) == 0 )
v15 &= ~qword_140C4DC80;
v7 = 0xFFFFFFFFFi64;
if( v9 != ((v15 >> 12) & 0xFFFFFFFFFi64) )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
LABEL_37:
_InterlockedAnd64((volatile signed __int64 *)v10 + 3, 0x7FFFFFFFFFFFFFFFui64);
goto LABEL_38;
}
LABEL_33:
if( MiIsPfnFromSlabAllocation((INT64)v10) )
{
v17 = MiUnlinkPageFromList((_MMPFN *)v10, 1ui64);
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
if( v17 )
{
v10[35] &= 0xF8u;
MiInsertPageInList((_MMPFN *)v10, 0x800ui64);
}
else
{
MiDiscardTransitionPteEx((UINT64)v10, 0i64);
}
goto LABEL_37;
}
if( !*v4 )
{
AvailablePagesExcludeSlists = MiGetAvailablePagesExcludeSlists((INT64)Partition);
KeBugCheckEx(0x4Eu, 1ui64, (ULONG_PTR)v4, AvailablePagesExcludeSlists, 0i64);
}
--*v4;
if( dword_140C4E40C == 1 )
{
v19 = v9 & 0x1F;
LOBYTE(v20) = 1;
v21 = (volatile signed __int32 *)(qword_140C4E468 + 4 * (v9 >> 5));
if( v19 + 1 <= 0x20 )
{
v22 = 1 << v19;
goto LABEL_52;
}
if( (v9 & 0x1F) == 0 )
goto LABEL_51;
_InterlockedOr(v21++, ((1 << (32 - (v9 & 0x1F))) - 1) << v19);
v20 = 1i64 - (32 - (unsigned int)(v9 & 0x1F));
if( v20 >= 0x20 )
{
v23 = v20 >> 5;
v20 += -32i64 * (v20 >> 5);
do
{
*v21++ = -1;
--v23;
}
while( v23 );
}
if( v20 )
{
LABEL_51:
v22 = (1 << v20) - 1;
LABEL_52:
_InterlockedOr(v21, v22);
}
}
v24 = 0;
v25 = *(_QWORD *)v10 & 0xFFFFFFFFFi64;
if( (v10[35] & 8) != 0 )
{
if( (unsigned int)MiIsDecayPfn(*((_QWORD *)v10 + 3) & 0xFFFFFFFFFi64) == 1 && v26 == v27 )
{
MiDeleteParentDecayNode((_MMPFN *)v10);
v24 = 1;
}
else
{
updated = MiUpdateTransitionPteFrame(*(_QWORD *)(v28 + 48 * v27 + 16), v26);
*(_QWORD *)(v30 + 16) = updated;
MiSetPfnBlink((_MMPFN *)(v32 + 48 * v31), v33, 0i64);
v24 = 1;
}
}
else
{
v4[2] = v25;
if( v25 == 0xFFFFFFFFFi64 )
v4[3] = 0xFFFFFFFFFi64;
else
MiSetPfnBlink((_MMPFN *)(v16 + 48 * v25), 0xFFFFFFFFFui64, 0i64);
}
MiUnlinkNumaStandbyPage((_MMPFN *)v10);
if( v24 == 1 )
v10[35] &= ~8u;
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
v34 = MiDecreaseAvailablePages(Partition, 1ui64, 0xFFFFFFFFFFFFFFFFui64, (unsigned int)Flagsa);
*((_QWORD *)v10 + 3) &= 0xFFFFFFF000000000ui64;
MiRestoreTransitionPte((_MMPFN *)v10, 0i64);
v36 = (UNICODE_STRING *)*((_QWORD *)v10 + 2);
v37 = (unsigned __int64)v36 >> 11;
if( ((unsigned __int16)v36 & 0x400) == 0 )
v37 = (unsigned __int64)v36 >> 3;
LOBYTE(v38) = MI_PFN_IS_PROTO((UNICODE_STRING *)v10, v36, v37, v35);
v39 = 4352i64;
if( !v38 )
v39 = 5056i64;
_InterlockedDecrement64((volatile signed __int64 *)((char *)Partition + v39));
v40 = v10[34];
*((_QWORD *)v10 + 5) &= ~0x8000000000000000ui64;
v10[34] = v40 & 0xC7;
v41 = v10[35] & 0xDF;
*(_QWORD *)v10 = 0i64;
v10[35] = v41;
v10[34] = v10[34] & 0xF8 | 5;
*((_QWORD *)v10 + 2) = ZeroPte;
MiSetOriginalPtePfnFromFreeList((UINT64 *)v10 + 2);
if( (v42 & 1) != 0 )
*((_QWORD *)v10 + 2) = MiUpdatePageFileHighInPte(*((_QWORD *)v10 + 2), 4294967293i64);
if( !v34 )
{
MiReturnFreeZeroPage((INT64)v10);
_InterlockedAnd64((volatile signed __int64 *)v10 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(CurrentIrql);
return -1i64;
}
_InterlockedAnd64((volatile signed __int64 *)v10 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(CurrentIrql);
return v9;
}Referenced by:
MiGetPage
MiPruneStandbyPages
MiPurgePartitionStandby