CcUnmapInactiveViews
VOID __fastcall CcUnmapInactiveViews(UINT64 NumberOfViewsToUnmap, UINT64 Flags, VOID **ViewToUnmap){
void **v3;
char v4;
void **v5;
unsigned int v6;
unsigned __int8 v7;
INT64 v8;
unsigned __int64 v9;
UINT64 v10;
UINT64 v11;
unsigned __int64 *v12;
v4 = 0;
v5 = v3;
v6 = (unsigned int)ViewToUnmap;
if( dword_140C507FC && (_DWORD)CcNumberOfMappedVacbs )
{
if( NumberOfViewsToUnmap )
{
v12 = *(unsigned __int64 **)(NumberOfViewsToUnmap + 8);
if( v12 )
CcUnmapInactiveViewsInternal(v12, 64i64, (INT64)ViewToUnmap, v3);
}
else
{
while( 1 )
{
LODWORD(v10) = PsGetNextPartitionUnsafe((PVOID)NumberOfViewsToUnmap);
v11 = v10;
if( !v10 )
break;
v7 = KeAcquireSpinLockRaiseToDpc((UINT64 *)&CmpDummyThreadEvent + 364);
v8 = *(_QWORD *)(v11 + 8);
v9 = v7;
if( v8 && *(_BYTE *)(v8 + 966) < 2u )
{
if( _InterlockedIncrement64((volatile signed __int64 *)(v8 + 968)) <= 1 )
__fastfail(0xEu);
}
else
{
v8 = 0i64;
}
KxReleaseSpinLock((UINT64 *)&CmpDummyThreadEvent + 364);
__writecr8(v9);
if( v8 )
{
v4 |= CcUnmapInactiveViewsInternal((unsigned __int64 *)v8, 64i64, v6, v5);
CcDereferencePartition(v8);
}
NumberOfViewsToUnmap = v11;
}
}
}
}Referenced by:
CcGetVacbMiss
MiDereferenceSegmentThread
MiObtainSystemCacheView
MiRemoveUnusedSegments