MiUnlinkPageFromBadList

UINT8 __fastcall MiUnlinkPageFromBadList(_RTL_ATOM_TABLE *AtomTable){
  char v1; 
  char v2; 
  unsigned __int64 v4; 
  WORK_QUEUE_TYPE v5; 
  _MMPFN *PfnDb; 
  ULONG_PTR *v7; 
  INT64 *v8; 
  int v9; 
  __int64 v10; 
  __int64 v11; 
  unsigned __int64 *v12; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  volatile signed __int32 *v15; 
  unsigned int v16; 
  int v17; 
  unsigned __int64 v18; 
  UINT8 result; 
  _BYTE LockHandle[56]; 
  v2 = v1;
  memset(LockHandle, 0, 24);
  v4 = ((char *)AtomTable - (char *)MmGetPfnDb()) / 48;
  if( MiIsPfnFileOnly((INT64)AtomTable) )
  {
    v7 = &MiSystemPartition;
    v8 = &qword_140C4C800;
  }
  else
  {
    v7 = *(ULONG_PTR **)(qword_140C4E388 + 8 * ((*(_QWORD *)&AtomTable[1].Signature >> 39) & 0x3FFi64));
    v8 = (INT64 *)(v7 + 512);
  }
  v9 = v2 & 0x80;
  if( !v9 )
  {
    *(_QWORD *)LockHandle = 0i64;
    *(_QWORD *)&LockHandle[8] = v7 + 516;
    KxAcquireQueuedSpinLock((PIO_WORKITEM)LockHandle, (PIO_WORKITEM_ROUTINE)(v7 + 516), v5, PfnDb);
    PfnDb = MmGetPfnDb();
  }
  v10 = *(_QWORD *)&AtomTable->Signature & 0xFFFFFFFFFi64;
  v11 = *(_QWORD *)&AtomTable->Flags & 0xFFFFFFFFFi64;
  if( v10 == 0xFFFFFFFFFi64 )
    v8[3] = v11;
  else
    MiSetPfnBlink((_MMPFN *)((char *)PfnDb + 48 * v10), *(_QWORD *)&AtomTable->Flags & 0xFFFFFFFFFi64, 0i64);
  if( v11 == 0xFFFFFFFFFi64 )
  {
    v8[2] = v10;
  }
  else
  {
    v12 = (unsigned __int64 *)((char *)MmGetPfnDb() + 48 * v11);
    *v12 = v10 | *v12 & 0xFFFFFFF000000000ui64;
  }
  if( v8 != &qword_140C4C800 && dword_140C4E40C == 1 )
  {
    v13 = v4 & 0x1F;
    LOBYTE(v14) = 1;
    v15 = (volatile signed __int32 *)(qword_140C4E468 + 4 * (v4 >> 5));
    if( v13 + 1 <= 0x20 )
    {
      v16 = 1 << v13;
LABEL_22:
      _InterlockedOr(v15, v16);
      goto LABEL_23;
    }
    if( (v4 & 0x1F) == 0 )
      goto LABEL_21;
    v17 = v4 & 0x1F;
    _InterlockedOr(v15++, ((1 << (32 - v17)) - 1) << v13);
    v14 = 1i64 - (unsigned int)(32 - v17);
    if( v14 >= 0x20 )
    {
      v18 = v14 >> 5;
      v14 += -32i64 * (v14 >> 5);
      do
      {
        *v15++ = -1;
        --v18;
      }
      while( v18 );
    }
    if( v14 )
    {
LABEL_21:
      v16 = (1 << v14) - 1;
      goto LABEL_22;
    }
  }
LABEL_23:
  --*v8;
  if( !v9 )
    KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)LockHandle);
  *(_QWORD *)&AtomTable->Signature = 0i64;
  MiSetPfnBlink((_MMPFN *)AtomTable, 0i64, 1ui64);
  if( v8 != &qword_140C4C800 )
    AtomTable->PushLock.Value = 0i64;
  return result;
}

Referenced by:

MiPurgeBadFileOnlyPages
MiRemoveBadPages
MiTransferPartitionPageRun
MiUnlinkBadPages
MiUnlinkPageFromList