MiPurgeBadFileOnlyPages
NTSTATUS __stdcall MiPurgeBadFileOnlyPages(INT64 a1, INT64 a2, UINT8 *a3){
unsigned __int8 CurrentIrql;
unsigned __int64 Flink;
_MMPFN *PfnDb;
INT64 v6;
unsigned __int64 Total;
__int64 v8;
__int64 v9;
unsigned __int8 v10;
unsigned __int64 v11;
_MI_CONTROL_AREA_WAIT_BLOCK *v12;
INT64 *v13;
_MI_CONTROL_AREA_WAIT_BLOCK *v14;
unsigned __int64 v15;
UINT8 v16;
__int16 v17;
NTSTATUS result;
_KLOCK_QUEUE_HANDLE LockQueue;
_MI_CONTROL_AREA_WAIT_BLOCK *Gate;
INT64 v21;
v21 = 0i64;
memset(&LockQueue, 0, sizeof(LockQueue));
Gate = 0i64;
do
{
while( 1 )
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LockQueue.LockQueue.Lock = (unsigned __int64 *volatile)((char *)&stru_140C50B28 + 4024);
LockQueue.LockQueue.Next = 0i64;
KxAcquireQueuedSpinLock(&LockQueue.LockQueue, (UINT64 *)&stru_140C50B28 + 503);
Flink = stru_140C4C800.Flink;
byte_140C4C872 = 0;
if( stru_140C4C800.Flink == 0xFFFFFFFFFi64 )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
goto LABEL_21;
}
PfnDb = MmGetPfnDb();
v6 = (INT64)&PfnDb[stru_140C4C800.Flink];
if( !_interlockedbittestandset64((volatile signed __int32 *)(v6 + 24), 0x3Fui64) )
break;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
__writecr8(CurrentIrql);
}
Total = stru_140C4C800.Total;
MiUnlinkPageFromBadList(&PfnDb[Flink]);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
MiAddLockedPageCharge((_MMPFN *)v6, 1ui64);
Gate = 0i64;
v21 = 0i64;
LODWORD(v8) = MiPreventControlAreaDeletion(v6, 1i64, &v21, (INT64 **)&Gate);
v9 = v8;
_InterlockedAnd64((volatile signed __int64 *)(v6 + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(CurrentIrql);
if( v8 )
{
if( Gate )
MiReleaseControlAreaWaiters(Gate);
MiPurgeFileOnlyPfn(v6);
if( v21 )
MiDecrementSubsection((PVOID)v21);
v10 = ExAcquireSpinLockExclusive((INT64 *)(v9 + 72));
*(_DWORD *)(v9 + 56) &= ~4u;
v11 = v10;
v12 = MiDecrementModifiedWriteCount((_CONTROL_AREA *)v9, 1ui64);
v13 = (INT64 *)(v9 + 72);
Gate = v12;
v14 = v12;
ExReleaseSpinLockExclusiveFromDpcLevel(v13);
__writecr8(v11);
if( v14 )
MiReleaseControlAreaWaiters(v14);
}
v15 = MiLockPageInline((_MMPFN *)v6);
if( MiRemoveLockedPageCharge((_MMPFN *)v6) )
{
MiSetPfnTbFlushStamp((_MMPFN *)v6, 0i64, 1ui64);
MiPfnReferenceCountIsZero((_MMPFN *)v6, Flink, v16);
}
v17 = *(_WORD *)(v6 + 32);
_InterlockedAnd64((volatile signed __int64 *)(v6 + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v15);
}
while( !v17 || !Total || Total != 1 );
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&stru_140C50B28 + 503, &LockQueue);
if( stru_140C4C800.Total )
byte_140C4C872 = 1;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
CurrentIrql = LockQueue.OldIrql;
LABEL_21:
result = CurrentIrql;
__writecr8(CurrentIrql);
return result;
}Referenced by:
MiDeleteExtentPfns