CcPurgeCacheSection
INT8 __fastcall CcPurgeCacheSection(INT64 *a1, UINT64 a2, INT64 a3, INT8 a4){
int v6;
INT64 v7;
unsigned int v8;
int v9;
INT8 v10;
unsigned __int64 *Partition;
bool v13;
__int64 v14;
__int64 v15;
INT8 v16;
UINT64 v17;
UINT8 v18;
__int64 v19;
_QWORD *i;
int v21;
UINT64 v22;
UINT8 v23;
char ExtentPagesActive[8];
unsigned __int64 *v25;
INT64 v26;
_KLOCK_QUEUE_HANDLE v27;
_KLOCK_QUEUE_HANDLE LockHandle;
_SECTION_OBJECT_POINTERS *FsSectionObjectPointera;
unsigned int RegionSize;
RegionSize = a3;
ExtentPagesActive[0] = 0;
v6 = 0;
v25 = 0i64;
memset(&LockHandle, 0, sizeof(LockHandle));
memset(&v27, 0, sizeof(v27));
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&WheapErrorSourceTable + 189, &LockHandle);
v7 = a1[1];
v26 = v7;
if( v7 )
{
Partition = (unsigned __int64 *)CcGetPartition((_QWORD *)v7);
v13 = (*(_DWORD *)(v7 + 152) & 0x2000) == 0;
v25 = Partition;
if( !v13 )
{
if( (a2 & 1) == 0 )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
return 1;
}
a2 ^= 1ui64;
}
KeAcquireInStackQueuedSpinLock(Partition + 16, &v27);
++*(_DWORD *)(v7 + 4);
++*(_DWORD *)(v7 + 536);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v27);
__writecr8(v27.OldIrql);
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( v7 )
{
LODWORD(v14) = MmGetControlAreaPartition((INT64)a1);
v15 = (__int64)v25;
if( v25 != *(unsigned __int64 **)(v14 + 8) )
KeBugCheckEx(0x34u, (PVOID)0x122B, (PVOID)0xFFFFFFFFC0000420i64, 0i64, 0i64);
v16 = a4;
if( (a4 & 1) != 0 )
{
for( i = (_QWORD *)(v7 + 224); (_QWORD *)*i != i; CcUninitializeCacheMap(
*(_FILE_OBJECT **)(*i - 88i64),
0i64,
0i64) )
;
v15 = (__int64)v25;
v16 = a4;
}
if( (v16 & 8) != 0 )
{
MmTrimSection((_SECTION_OBJECT_POINTERS *)a1, (_LARGE_INTEGER *)a2, RegionSize, 0i64);
if( v21 < 0 )
{
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)(v15 + 128), &v27);
CcDecrementOpenCount((_SHARED_CACHE_MAP *)v7, v22, v23);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v27);
__writecr8(v27.OldIrql);
return 0;
}
}
else
{
CcUnmapVacbArray((_SHARED_CACHE_MAP *)v7, (_LARGE_INTEGER *)a2, RegionSize, 0, 1u);
}
if( a2 )
v6 = 1;
}
v8 = v6 | 2;
if( (a4 & 4) == 0 )
v8 = v6;
v9 = (a4 & 4) != 0 ? 5 : -1;
v10 = MmPurgeSection((_SECTION_OBJECT_POINTERS *)a1, (_LARGE_INTEGER *)a2, RegionSize, v8, (UINT8 *)ExtentPagesActive);
if( !v10 )
{
do
{
if( RegionSize )
break;
if( !MmCanFileBeTruncated(a1, (UINT64 *)a2) )
break;
if( (a4 & 2) != 0 )
break;
KeDelayExecutionThread(0, 0, &CcCollisionDelay);
if( !--v9 )
break;
v10 = MmPurgeSection((_SECTION_OBJECT_POINTERS *)a1, (_LARGE_INTEGER *)a2, 0i64, v8, (UINT8 *)ExtentPagesActive);
}
while( !v10 );
v7 = v26;
}
if( v7 )
{
if( !RegionSize )
{
if( a2 )
{
v19 = *(_QWORD *)a2;
if( *(_QWORD *)a2 < *(_QWORD *)(v7 + 368) )
{
FsSectionObjectPointera = (_SECTION_OBJECT_POINTERS *)(v19 + 0x3FFFF);
LODWORD(FsSectionObjectPointera) = (v19 + 0x3FFFF) & 0xFFFC0000;
*(_QWORD *)(v7 + 368) = (char *)FsSectionObjectPointera + 0x40000;
}
}
else
{
*(_QWORD *)(v7 + 368) = 0i64;
}
}
KeAcquireInStackQueuedSpinLock(v25 + 16, &v27);
CcDecrementOpenCount((_SHARED_CACHE_MAP *)v7, v17, v18);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v27);
__writecr8(v27.OldIrql);
}
return v10;
}Referenced by:
CcCoherencyFlushAndPurgeCache
CcPurgeAndClearCacheSection
CcSetFileSizesEx
CcUninitializeCacheMap
CcUnmapAndPurge
CcZeroEndOfLastPage