MiInsertAndUnlockStandbyPages
VOID __fastcall MiInsertAndUnlockStandbyPages(_MMPFN *DecayPfn, _MMPFN **LockedPfns, UINT8 *LockCount, UINT64 PageIrql){
unsigned int v4;
unsigned int v5;
unsigned __int8 v6;
_MMPFN **v7;
__int64 v9;
int v10;
unsigned int v11;
_MMPFN *PfnDb;
_MMPFN *v13;
void *v14;
char v15;
unsigned __int64 v16;
char v17;
unsigned int v18;
UINT64 v19;
unsigned int v20;
_MMPFN **v21;
__int64 v22;
WORK_QUEUE_TYPE v23;
_MMPFN **v24;
__int64 v25;
struct _IO_WORKITEM LockHandle;
unsigned __int8 v28;
v28 = PageIrql;
v4 = 0;
v5 = (unsigned int)LockCount;
v6 = PageIrql;
v7 = LockedPfns;
v9 = 0i64;
memset(&LockHandle, 0, 24);
if( !DecayPfn )
{
v10 = 0xFFFFFF;
v11 = 0;
if( !(_DWORD)LockCount )
goto LABEL_21;
PfnDb = MmGetPfnDb();
do
{
v13 = *v7;
v14 = (void *)(*((_QWORD *)*v7 + 3) & 0x3FFFFFFFFFFFFFFFi64);
if( v14 || (v15 = *((_BYTE *)v13 + 34), (v15 & 7) == 6) || (v15 & 0x10) != 0 )
KeBugCheckEx(0x4Eu, 6ui64, (*v7 - PfnDb) / 48, (ULONG_PTR)v14, *((unsigned int *)v13 + 8));
v16 = *((_QWORD *)v13 + 5);
if( (v16 & 0x2000000000000i64) != 0 || (v17 = *((_BYTE *)v13 + 35), (v17 & 0x40) != 0) )
{
if( v10 != 0xFFFFFF )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
v10 = 0xFFFFFF;
}
v19 = 4i64;
}
else
{
if( (v17 & 8) != 0 )
v18 = 5;
else
v18 = v17 & 7;
if( !v9 )
v9 = *(_QWORD *)(qword_140C4E388 + 8 * ((v16 >> 39) & 0x3FF));
if( v18 != v10 || v9 != *(_QWORD *)(qword_140C4E388 + 8 * ((v16 >> 39) & 0x3FF)) )
{
if( v10 != 0xFFFFFF )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
v16 = *((_QWORD *)v13 + 5);
}
v10 = v18;
v23 = (v16 >> 39) & 0x3FF;
v9 = *(_QWORD *)(qword_140C4E388 + 8i64 * (unsigned int)v23);
LockHandle.WorkItem.List.Flink = 0i64;
LockHandle.WorkItem.List.Blink = (_LIST_ENTRY *)(v9 + 8 * (v18 + 4 * (v18 + 77i64)));
KxAcquireQueuedSpinLock(&LockHandle, (PIO_WORKITEM_ROUTINE)LockHandle.WorkItem.List.Blink, v23, v14);
}
v19 = 132i64;
}
MiInsertPageInList(v13, v19);
++v11;
PfnDb = MmGetPfnDb();
++v7;
}
while( v11 < v5 );
if( v10 != 0xFFFFFF )
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
v7 = LockedPfns;
goto LABEL_20;
}
if( (_DWORD)LockCount )
{
v24 = LockedPfns;
v25 = (unsigned int)LockCount;
do
{
MiInsertProtectedStandbyPage((INT64)DecayPfn, (UINT64)*v24++);
--v25;
}
while( v25 );
LABEL_20:
v6 = v28;
}
LABEL_21:
v20 = v5 - 1;
if( v6 == 17 )
v20 = v5;
if( v20 )
{
v21 = v7;
v22 = v20;
v4 = v20;
do
{
_InterlockedAnd64((volatile signed __int64 *)*v21++ + 3, 0x7FFFFFFFFFFFFFFFui64);
--v22;
}
while( v22 );
}
if( v6 != 17 )
{
_InterlockedAnd64((volatile signed __int64 *)v7[v4] + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v6);
}
}Referenced by:
MiCopyDataPageToImagePage
MiDecrementAndInsertStandbyPages
MiFinishHardFault
MiWalkEntireImage