CcPurgeAndClearCacheSection

NTSTATUS __stdcall CcPurgeAndClearCacheSection(
        _SHARED_CACHE_MAP *SharedCacheMap,
        _LARGE_INTEGER *FileOffset,
        UINT64 a3){
  _LARGE_INTEGER *p_FileOffseta; 
  _KEVENT *v5; 
  _FILE_OBJECT *v6; 
  INT8 v7; 
  NTSTATUS result; 
  _LARGE_INTEGER v9; 
  size_t v10; 
  _SHARED_CACHE_MAP *v11; 
  _KEVENT *v12; 
  UINT64 RequestHighPriorityMapping; 
  UINT64 PerformingReadAhead; 
  UINT64 ReceivedLength; 
  _LARGE_INTEGER FileOffseta; 
  _VACB *Vacb[2]; 
  UINT64 VirtualAddress; 
  _IO_STATUS_BLOCK IoStatus; 

  p_FileOffseta = FileOffset;
  FileOffseta.QuadPart = 0i64;
  IoStatus = 0i64;
  Vacb[0] = 0i64;
  if( (*((_DWORD *)SharedCacheMap + 38) & 0x2000) != 0 )
  {
    if( ((unsigned __int8)FileOffset & 1) == 0 )
      return -1073740747;
    p_FileOffseta = (_LARGE_INTEGER *)((unsigned __int64)FileOffset ^ 1);
  }
  v6 = CcReferenceSharedCacheMapFileObject(SharedCacheMap);
  Vacb[1] = (_VACB *)v6;
  if( (p_FileOffseta->anonymous_0.LowPart & 0xFFF) == 0 )
    goto LABEL_3;
  v9 = *p_FileOffseta;
  FileOffseta = *p_FileOffseta;
  p_FileOffseta = &FileOffseta;
  if( *((_QWORD *)SharedCacheMap + 21) && *((_QWORD *)SharedCacheMap + 11) )
  {
    v10 = 4096 - (v9.anonymous_0.LowPart & 0xFFF);
    LODWORD(PerformingReadAhead) = 0;
    LODWORD(RequestHighPriorityMapping) = 1;
    VirtualAddress = (UINT64)CcGetVirtualAddress(
                               SharedCacheMap,
                               v9,
                               Vacb,
                               &ReceivedLength,
                               RequestHighPriorityMapping,
                               PerformingReadAhead);
    memset((VOID *)VirtualAddress, 0i64, v10);
    if( v9.QuadPart > *((_QWORD *)SharedCacheMap + 6) )
    {
      MmSetAddressRangeModifiedEx(VirtualAddress, 1i64);
      CcUpdateSharedCacheMapFlag(SharedCacheMap, 0x20000ui64, 1u);
    }
    else
    {
      CcSetDirtyInMask(SharedCacheMap, &FileOffseta, v10, 0i64);
    }
    FileOffseta.QuadPart = v10 + v9.QuadPart;
    v11 = Vacb[0]->SharedCacheMap;
    if( !(unsigned __int16)_InterlockedDecrement((volatile signed __int32 *)&Vacb[0]->Overlay) )
    {
      v12 = (_KEVENT *)*((_QWORD *)v11 + 23);
      if( v12 )
        KeSetEvent(v12, 0, 0);
      _InterlockedDecrement((volatile signed __int32 *)v11 + 136);
    }
    goto LABEL_3;
  }
  LODWORD(PerformingReadAhead) = 0;
  MmFlushSection(v6->SectionObjectPointer, &FileOffseta, 1ui64, v5, &IoStatus, PerformingReadAhead);
  result = IoStatus.Status;
  if( IoStatus.Status >= 0 )
  {
LABEL_3:
    v7 = CcPurgeCacheSection((INT64 *)v6->SectionObjectPointer, (UINT64)p_FileOffseta, 0i64, 0);
    CcDereferenceSharedCacheMapFileObject(SharedCacheMap, v6);
    return v7 == 0 ? 0xC0000435 : 0;
  }
  return result;
}

Referenced by:

CcSetFileSizesEx