MiUnlinkPageFromBadList

VOID __stdcall MiUnlinkPageFromBadList(_MMPFN *Pfn1){
  char v1; 
  char v2; 
  unsigned __int64 v4; 
  int v5; 
  _MMPFN *PfnDb; 
  _MI_PARTITION *v7; 
  _MMPFNLIST *p_BadPageListHead; 
  int v9; 
  __int64 v10; 
  __int64 v11; 
  _MMPFN *v12; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  volatile signed __int32 *v15; 
  unsigned int v16; 
  int v17; 
  unsigned __int64 v18; 
  _KLOCK_QUEUE_HANDLE LockQueue[2]; 

  v2 = v1;
  memset(LockQueue, 0, 24);
  v4 = Pfn1 - MmGetPfnDb();
  LOBYTE(v5) = MiIsPfnFileOnly((INT64)Pfn1);
  if( v5 )
  {
    v7 = &Irp;
    p_BadPageListHead = &stru_140C4C800;
  }
  else
  {
    v7 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)Pfn1->u4._bf_0 >> 39) & 0x3FF));
    p_BadPageListHead = &v7->PageLists.BadPageListHead;
  }
  v9 = v2 & 0x80;
  if( !v9 )
  {
    LockQueue[0].LockQueue.Next = 0i64;
    LockQueue[0].LockQueue.Lock = &v7->PageLists.BadPageListHead.Lock;
    KxAcquireQueuedSpinLock(&LockQueue[0].LockQueue, &v7->PageLists.BadPageListHead.Lock);
    PfnDb = MmGetPfnDb();
  }
  v10 = Pfn1->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 & 0xFFFFFFFFFi64;
  v11 = Pfn1->u2._bf_0 & 0xFFFFFFFFFi64;
  if( v10 == 0xFFFFFFFFFi64 )
    p_BadPageListHead->Blink = v11;
  else
    MiSetPfnBlink(&PfnDb[v10], Pfn1->u2._bf_0 & 0xFFFFFFFFFi64, 0i64);
  if( v11 == 0xFFFFFFFFFi64 )
  {
    p_BadPageListHead->Flink = v10;
  }
  else
  {
    v12 = &MmGetPfnDb()[v11];
    v12->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 = v10 | v12->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 & 0xFFFFFFF000000000ui64;
  }
  if( p_BadPageListHead != &stru_140C4C800 && *(&stru_140C4DB30 + 567) == 1 )
  {
    v13 = v4 & 0x1F;
    LOBYTE(v14) = 1;
    v15 = (volatile signed __int32 *)(*(&stru_140C4DB30 + 295) + 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:
  --p_BadPageListHead->Total;
  if( !v9 )
    KeReleaseInStackQueuedSpinLockFromDpcLevel(LockQueue);
  Pfn1->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 = 0i64;
  MiSetPfnBlink(Pfn1, 0i64, 1ui64);
  if( p_BadPageListHead != &stru_140C4C800 )
    Pfn1->PteLong = 0i64;
}

Referenced by:

MiPurgeBadFileOnlyPages
MiRemoveBadPages
MiTransferPartitionPageRun
MiUnlinkBadPages
MiUnlinkPageFromList