MiFreeModifiedReservations
VOID __stdcall MiFreeModifiedReservations(_MMPAGING_FILE *PagingFile, UINT64 FreeAllPages){
__int16 v2;
int v3;
INT64 v4;
unsigned __int64 v5;
unsigned __int64 v6;
__int64 v7;
char *v8;
unsigned __int8 v9;
unsigned __int64 v10;
WORK_QUEUE_TYPE v11;
PVOID v12;
UINT64 v13;
INT64 v14;
__int64 v15;
_BYTE LockHandle[72];
v2 = *((_WORD *)PagingFile + 102);
v3 = FreeAllPages;
memset(LockHandle, 0, 24);
if( (v2 & 0x40) == 0 )
{
v4 = *((_QWORD *)PagingFile + 31);
v5 = 0i64;
v6 = (_DWORD)FreeAllPages == 0 ? 0x10000 : 0;
v7 = 5i64 * (v2 & 0xF);
while( 1 )
{
v15 = *(_QWORD *)(v4 + 8 * v7 + 2832);
if( v15 == 0xFFFFFFFFFi64 )
break;
v8 = (char *)MmGetPfnDb() + 48 * v15;
v9 = MiLockPageInline((INT64)v8);
*(_QWORD *)LockHandle = 0i64;
v10 = v9;
*(_QWORD *)&LockHandle[8] = v4 + 7520;
KxAcquireQueuedSpinLock((PIO_WORKITEM)LockHandle, (PIO_WORKITEM_ROUTINE)(v4 + 7520), v11, v12);
if( v15 == *(_QWORD *)(v4 + 8 * v7 + 2832) )
{
MiUnlinkPageFromList((_MMPFN *)v8, 1ui64);
v13 = *((_QWORD *)v8 + 2);
*((_QWORD *)v8 + 2) = v13 & 0xFFFFFFFFFFFFFFFDui64;
MiInsertPageInList((_MMPFN *)v8, 0x88ui64);
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)LockHandle);
_InterlockedAnd64((volatile signed __int64 *)v8 + 3, 0x7FFFFFFFFFFFFFFFui64);
MiReleasePageFileInfo(
v4,
v13,
1,
v14,
*(INT64 *)LockHandle,
*(INT64 *)&LockHandle[8],
*(INT64 *)&LockHandle[16],
*(INT64 *)&LockHandle[24],
*(INT64 *)&LockHandle[32],
*(INT64 *)&LockHandle[40],
*(INT64 *)&LockHandle[48],
*(INT64 *)&LockHandle[56]);
__writecr8(v10);
++v5;
if( !v3 && v5 >= v6 )
return;
}
else
{
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)LockHandle);
_InterlockedAnd64((volatile signed __int64 *)v8 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v10);
}
}
}
}Referenced by:
MiModifiedPageWriter
MiPageFileNoFreeSpace