CcUnmapInactiveViewsInternal

INT64 __fastcall CcUnmapInactiveViewsInternal(INT64 a1, UINT64 a2, CHAR a3, _QWORD *a4){
  unsigned int v4; 
  _VACB_ARRAY_HEADER *RandomVacbArrayWithReference; 
  int v6; 
  void *v7; 
  unsigned int v8; 
  bool v9; 
  __int64 v10; 
  unsigned int v11; 
  KIRQL v12; 
  unsigned int v13; 
  unsigned int v14; 
  unsigned int v15; 
  UINT8 CanReuseVacb; 
  bool v17; 
  __int64 v18; 
  __int64 v19; 
  UINT8 v20; 
  __int64 v21; 
  KIRQL v22; 
  _QWORD *v23; 
  _LIST_ENTRY *Partition; 
  WORK_QUEUE_TYPE v25; 
  PVOID v26; 
  __int64 v27; 
  INT64 v28; 
  _SHARED_CACHE_MAP *v29; 
  unsigned int Flags; 
  unsigned int v31; 
  __int64 v32; 
  __int64 QuadPart; 
  _VACB *v34; 
  _VACB *v35; 
  int v36; 
  unsigned int v37; 
  KIRQL v38; 
  unsigned __int64 OldIrql; 
  __int64 v40; 
  int v41; 
  __int64 v42; 
  bool v43; 
  bool v45; 
  unsigned int v46; 
  int v47; 
  unsigned int v48; 
  int v49; 
  int v50; 
  int v51; 
  void *v52; 
  unsigned int v53; 
  KLOCK_QUEUE_HANDLE v54; 
  struct _IO_WORKITEM LockHandle; 
  int v57; 
  int v58; 
  v57 = a2;
  v47 = -1;
  v48 = 0;
  v53 = 0;
  v51 = 0;
  v50 = 0;
  v4 = 0;
  v49 = 0;
  RandomVacbArrayWithReference = 0i64;
  v52 = 0i64;
  v6 = 0;
  v46 = 0;
  v7 = 0i64;
  v8 = 0;
  memset(&v54, 0, sizeof(v54));
  if( a4 )
  {
    *a4 = 0i64;
    v50 = 1;
  }
  v58 = a3 & 1;
  v9 = !(a3 & 1);
  v45 = v9;
  do
  {
    while( v4 < (unsigned int)a2 && v8 <= CcVacbArraysHighestUsedIndex )
    {
      if( RandomVacbArrayWithReference )
      {
        LODWORD(v10) = v47;
LABEL_19:
        if( v9 )
        {
          v13 = 0;
          while( 1 )
          {
            v14 = v13;
            v15 = RtlRandom((UINT64 *)&CcRandomSeed);
            CanReuseVacb = CcCanReuseVacb(
                             (_VACB *)((char *)&RandomVacbArrayWithReference[2
                                                                           * (v15
                                                                            % (RandomVacbArrayWithReference->HighestMappedIndex
                                                                             + 1))
                                                                           + 1]
                                     + 8 * (v15 % (RandomVacbArrayWithReference->HighestMappedIndex + 1))),
                             0i64);
            v13 = v14 + 1;
            if( CanReuseVacb )
              v13 = v14;
            v19 = v18 & -(__int64)(CanReuseVacb != 0);
            if( v19 )
              break;
            if( v13 > 0x10 )
            {
              ++CcDbgRandomFailed;
              v9 = v17;
              v45 = v17;
              goto LABEL_58;
            }
          }
        }
        else
        {
          if( (_DWORD)v10 == -1 )
          {
            LODWORD(v10) = RandomVacbArrayWithReference->HighestMappedIndex + 1;
            v47 = v10;
          }
          if( !(_DWORD)v10 )
            goto LABEL_58;
          do
          {
            v10 = (unsigned int)(v10 - 1);
            v20 = CcCanReuseVacb(
                    (_VACB *)((char *)&RandomVacbArrayWithReference[2 * v10 + 1] + 8 * (unsigned int)v10),
                    v7);
          }
          while( !v20 && (_DWORD)v10 );
          v47 = v10;
          v19 = v21 & -(__int64)(v20 != 0);
          if( !v19 )
          {
            v9 = v45;
LABEL_58:
            CcDereferenceVacbArray(RandomVacbArrayWithReference, 0);
            RandomVacbArrayWithReference = 0i64;
            goto LABEL_59;
          }
        }
        v22 = KeAcquireQueuedSpinLock(4ui64);
        if( CcCanReuseVacb((_VACB *)v19, v7) )
        {
          v23 = *(_QWORD **)(v19 + 8);
          memset(&LockHandle, 0, 24);
          Partition = (_LIST_ENTRY *)CcGetPartition(v23);
          LockHandle.WorkItem.List.Flink = 0i64;
          LockHandle.WorkItem.List.Blink = Partition + 8;
          KxAcquireQueuedSpinLock(&LockHandle, (PIO_WORKITEM_ROUTINE)&Partition[8], v25, v26);
          v27 = *(_QWORD *)(v19 + 8);
          if( *(_QWORD *)(*(_QWORD *)((*(_QWORD *)(v27 + 96) & 0xFFFFFFFFFFFFFFF0ui64) + 0x28) + 8i64) != v27 )
          {
            KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
            goto LABEL_56;
          }
          ++*(_DWORD *)(v27 + 4);
          ++*(_DWORD *)(v27 + 536);
          KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
          v28 = *(_QWORD *)(v19 + 16);
          v29 = *(_SHARED_CACHE_MAP **)(v19 + 8);
          Flags = v29->Flags;
          KeReleaseQueuedSpinLock(4ui64, v22);
          v31 = (Flags >> 9) & 1;
          CcAcquireBcbLockAndVacbLock(v31, (FAST_MUTEX *)v29);
          v32 = CcGetPartition(v29);
          if( a1 != v32
            || v28 < 0
            || (QuadPart = v29->SectionSize.QuadPart, v28 >= QuadPart)
            || (QuadPart <= 0x2000000 ? (v35 = v29->Vacbs[(unsigned __int64)(unsigned int)v28 >> 18]) : (CcGetVacbLargeOffset(v29, v28), v35 = v34),
                !v35 || *((_WORD *)v35 + 8)) )
          {
            CcReleaseBcbLockAndVacbLock(v31, (struct FAST_MUTEX *)v29);
            KeAcquireInStackQueuedSpinLock((UINT64 *)(v32 + 128), &v54);
            CcDecrementOpenCount((INT64)v29);
            KeReleaseInStackQueuedSpinLockFromDpcLevel(&v54);
            OldIrql = v54.OldIrql;
            v4 = v48;
            goto LABEL_54;
          }
          SetVacb(v29, (_LARGE_INTEGER)v28, 0i64, 0i64);
          if( *(_DWORD *)(v32 + 920) >= (unsigned int)CcMinimumFreeHighPriorityVacbs )
          {
            v36 = 0;
            if( !v50 )
            {
              v37 = v49 & 0xFFFFFFFD;
              v49 &= ~2u;
              if( !v52 && v58 )
                v52 = *(void **)v35;
              goto LABEL_45;
            }
          }
          else
          {
            v36 = 1;
          }
          v37 = v49 | 2;
          v52 = 0i64;
          v49 |= 2u;
LABEL_45:
          CcUnmapVacb(v35, v29, v37);
          CcReleaseBcbLockAndVacbLock(v31, (struct FAST_MUTEX *)v29);
          v4 = v48;
          if( !v36 )
          {
            v4 = v48 + 1;
            v53 = 1;
            ++v48;
            if( v50 )
            {
              v50 = 0;
              *a4 = *(_QWORD *)v35;
              *(_QWORD *)v35 = 0i64;
            }
          }
          v38 = KeAcquireQueuedSpinLock(4ui64);
          *((_QWORD *)v35 + 1) = 0i64;
          CcSetVacbInFreeList(v32, v35, v36);
          KeReleaseQueuedSpinLock(4ui64, v38);
          KeAcquireInStackQueuedSpinLock((UINT64 *)(v32 + 128), &v54);
          CcDecrementOpenCount((INT64)v29);
          KeReleaseInStackQueuedSpinLockFromDpcLevel(&v54);
          OldIrql = v54.OldIrql;
          v7 = v52;
LABEL_54:
          v9 = v45;
          __writecr8(OldIrql);
          v8 = v46;
          LODWORD(a2) = v57;
          v6 = v51;
        }
        else
        {
LABEL_56:
          v52 = 0i64;
          v7 = 0i64;
          KeReleaseQueuedSpinLock(4ui64, v22);
          LODWORD(a2) = v57;
          v9 = v45;
          v8 = v46;
        }
      }
      else
      {
        LODWORD(v10) = -1;
        v47 = -1;
        if( v9 )
        {
          RandomVacbArrayWithReference = CcGetRandomVacbArrayWithReference();
LABEL_15:
          if( RandomVacbArrayWithReference->MappingCount == 1 )
            goto LABEL_58;
          goto LABEL_19;
        }
        v11 = v8;
        v12 = KeAcquireQueuedSpinLock(4ui64);
        while( 1 )
        {
          RandomVacbArrayWithReference = CcReferenceVacbArray(v11);
          if( RandomVacbArrayWithReference )
            break;
          if( ++v11 >= 0x500 )
          {
            RandomVacbArrayWithReference = 0i64;
            goto LABEL_13;
          }
        }
        CcRecalculateVacbArrayHighwaterMark((INT64)RandomVacbArrayWithReference);
LABEL_13:
        KeReleaseQueuedSpinLock(4ui64, v12);
        v9 = v45;
        v46 = ++v8;
        if( RandomVacbArrayWithReference )
        {
          LODWORD(v10) = -1;
          goto LABEL_15;
        }
LABEL_59:
        LODWORD(a2) = v57;
      }
    }
    if( RandomVacbArrayWithReference )
    {
      CcDereferenceVacbArray(RandomVacbArrayWithReference, 0);
      LODWORD(a2) = v57;
      RandomVacbArrayWithReference = 0i64;
    }
    if( v6 || v4 >= (unsigned int)a2 )
      break;
    v6 = 1;
    v40 = ((unsigned int)a2 - v4) << 18;
    v41 = 0;
    v51 = 1;
    ExAcquireFastMutex(&CcBcbTrimNotificationListLock);
    v42 = CcBcbTrimNotificationList;
    if( (__int64 *)CcBcbTrimNotificationList != &CcBcbTrimNotificationList )
    {
      do
      {
        KeReleaseGuardedMutex(&CcBcbTrimNotificationListLock);
        v41 |= (*(__int64(__fastcall **)(__int64))(v42 + 16))(v40);
        ExAcquireFastMutex(&CcBcbTrimNotificationListLock);
        v42 = *(_QWORD *)v42;
      }
      while( (__int64 *)v42 != &CcBcbTrimNotificationList );
      v7 = v52;
    }
    KeReleaseGuardedMutex(&CcBcbTrimNotificationListLock);
    v8 = v46;
    LODWORD(a2) = v57;
    v43 = v41 == 0;
    v9 = v45;
  }
  while( !v43 );
  _InterlockedIncrement(&CcDbgNumberOfCcUnmapInactiveViews);
  return v53;
}

Referenced by:

CcUnmapInactiveViews