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