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