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