MiPurgeBadFileOnlyPages
INT64 __fastcall MiPurgeBadFileOnlyPages(INT64 a1, INT64 a2, UINT8 *a3){
void *v3;
unsigned __int8 CurrentIrql;
UINT64 v5;
_MMPFN *PfnDb;
INT64 v7;
INT64 v8;
INT64 v9;
KIRQL v10;
unsigned __int64 v11;
INT64 *v12;
INT64 *v13;
INT64 *v14;
unsigned __int64 v15;
UINT8 *v16;
__int16 v17;
INT64 result;
__int128 LockHandle;
__int64 LockHandle_16;
INT64 *v21;
ULONG_PTR BugCheckParameter2;
BugCheckParameter2 = 0i64;
LockHandle = 0i64;
LockHandle_16 = 0i64;
v21 = 0i64;
do
{
while( 1 )
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
*((_QWORD *)&LockHandle + 1) = &qword_140C51AE0;
*(_QWORD *)&LockHandle = 0i64;
KxAcquireQueuedSpinLock(
(PIO_WORKITEM)&LockHandle,
(PIO_WORKITEM_ROUTINE)&qword_140C51AE0,
(WORK_QUEUE_TYPE)a3,
v3);
v5 = PageFrameIndex;
byte_140C4C872 = 0;
if( PageFrameIndex == 0xFFFFFFFFFi64 )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
goto LABEL_21;
}
PfnDb = MmGetPfnDb();
v7 = (INT64)PfnDb + 48 * PageFrameIndex;
if( !_interlockedbittestandset64((volatile signed __int32 *)(v7 + 24), 0x3Fui64) )
break;
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
__writecr8(CurrentIrql);
}
v8 = qword_140C4C800;
MiUnlinkPageFromBadList((_RTL_ATOM_TABLE *)((char *)PfnDb + 48 * v5));
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
MiAddLockedPageCharge(v7, 1);
v21 = 0i64;
BugCheckParameter2 = 0i64;
v9 = MiPreventControlAreaDeletion(v7, 1i64, (INT64 *)&BugCheckParameter2, &v21);
_InterlockedAnd64((volatile signed __int64 *)(v7 + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(CurrentIrql);
if( v9 )
{
if( v21 )
MiReleaseControlAreaWaiters(v21);
MiPurgeFileOnlyPfn(v7);
if( BugCheckParameter2 )
MiDecrementSubsection((PVOID)BugCheckParameter2);
v10 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)(v9 + 72));
*(_DWORD *)(v9 + 56) &= ~4u;
v11 = v10;
MiDecrementModifiedWriteCount((_CONTROL_AREA *)v9, (_BYTE *)1);
v12 = (INT64 *)(v9 + 72);
v21 = v13;
v14 = v13;
ExReleaseSpinLockExclusiveFromDpcLevel(v12);
__writecr8(v11);
if( v14 )
MiReleaseControlAreaWaiters(v14);
}
v15 = (unsigned __int8)MiLockPageInline(v7);
if( (unsigned int)MiRemoveLockedPageCharge(v7) )
{
MiSetPfnTbFlushStamp((_MMPFN *)v7, 0i64, 1ui64);
MiPfnReferenceCountIsZero((_MMPFN *)v7, v5, v16);
}
v17 = *(_WORD *)(v7 + 32);
_InterlockedAnd64((volatile signed __int64 *)(v7 + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v15);
}
while( !v17 || !v8 || v8 != 1 );
KeAcquireInStackQueuedSpinLock(&qword_140C51AE0, (KLOCK_QUEUE_HANDLE *)&LockHandle);
if( qword_140C4C800 )
byte_140C4C872 = 1;
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
CurrentIrql = LockHandle_16;
LABEL_21:
result = CurrentIrql;
__writecr8(CurrentIrql);
return result;
}Referenced by:
MiDeleteExtentPfns