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