CcSetFileSizesEx

NTSTATUS __stdcall CcSetFileSizesEx(_FILE_OBJECT *FileObject, _CC_FILE_SIZES *FileSizes){
  LARGE_INTEGER AllocationSize; 
  LARGE_INTEGER ValidDataLength; 
  _SECTION_OBJECT_POINTERS *SectionObjectPointer; 
  char v6; 
  _LARGE_INTEGER *SharedCacheMap; 
  UINT64 v8; 
  UINT8 v9; 
  unsigned __int64 *v10; 
  _LARGE_INTEGER v11; 
  NTSTATUS v12; 
  NTSTATUS result; 
  UINT64 v14; 
  VOID *QuadPart; 
  NTSTATUS v16; 
  NTSTATUS v17; 
  NTSTATUS v18; 
  UINT64 v19; 
  UINT8 v20; 
  _KEVENT *v21; 
  char v22; 
  UINT64 v23; 
  _IO_STATUS_BLOCK IoStatus; 
  _KLOCK_QUEUE_HANDLE v25; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  _LARGE_INTEGER FileOffset; 
  UINT64 NewSectionSize; 
  PKSPIN_LOCK SpinLock; 

  AllocationSize = FileSizes->AllocationSize;
  ValidDataLength = FileSizes->ValidDataLength;
  FileOffset = FileSizes->FileSize;
  IoStatus = 0i64;
  NewSectionSize = AllocationSize.QuadPart;
  memset(&LockHandle, 0, sizeof(LockHandle));
  memset(&v25, 0, sizeof(v25));
  KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&WheapErrorSourceTable + 189, &LockHandle);
  SectionObjectPointer = FileObject->SectionObjectPointer;
  v6 = 1;
  SharedCacheMap = (_LARGE_INTEGER *)SectionObjectPointer->SharedCacheMap;
  if( SharedCacheMap && SharedCacheMap[21].QuadPart )
  {
    SpinLock = (PKSPIN_LOCK)((char *)CcGetPartition((_QWORD *)SectionObjectPointer->SharedCacheMap) + 128);
    KeAcquireInStackQueuedSpinLock(SpinLock, &v25);
    if( AllocationSize.QuadPart <= SharedCacheMap[4].QuadPart )
      goto LABEL_4;
    ++SharedCacheMap->anonymous_0.HighPart;
    ++SharedCacheMap[67].anonymous_0.LowPart;
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&v25);
    __writecr8(v25.OldIrql);
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
    NewSectionSize += 0xFFFFFi64;
    QuadPart = (VOID *)SharedCacheMap[21].QuadPart;
    LODWORD(NewSectionSize) = NewSectionSize & 0xFFF00000;
    v6 = 0;
    v16 = MmExtendSection(QuadPart, &NewSectionSize, 1ui64);
    v17 = v16;
    if( v16 < 0 )
    {
      FsRtlIsNtstatusExpected((unsigned int)v16);
      if( !v22 )
        v17 = -1073741588;
    }
    else
    {
      CcExtendVacbArray((_SHARED_CACHE_MAP *)SharedCacheMap, (_LARGE_INTEGER)NewSectionSize);
      v17 = v18;
    }
    KeAcquireInStackQueuedSpinLock(SpinLock, &v25);
    CcDecrementOpenCount((_SHARED_CACHE_MAP *)SharedCacheMap, v19, v20);
    if( v17 < 0 )
    {
      KeReleaseInStackQueuedSpinLock(&v25);
      RtlRaiseStatus(v17);
    }
    SharedCacheMap = (_LARGE_INTEGER *)FileObject->SectionObjectPointer->SharedCacheMap;
    if( SharedCacheMap )
    {
LABEL_4:
      ++SharedCacheMap->anonymous_0.HighPart;
      ++SharedCacheMap[67].anonymous_0.LowPart;
      if( v6 )
      {
        KeReleaseInStackQueuedSpinLockFromDpcLevel(&v25);
        __writecr8(v25.OldIrql);
        KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
        __writecr8(LockHandle.OldIrql);
        v10 = SpinLock;
        KeAcquireInStackQueuedSpinLock(SpinLock, &v25);
      }
      else
      {
        v10 = SpinLock;
      }
      v11 = SharedCacheMap[5];
      if( v11.QuadPart != 0x7FFFFFFFFFFFFFFFi64 )
      {
        if( FileOffset.QuadPart < v11.QuadPart )
          SharedCacheMap[5] = FileOffset;
        SharedCacheMap[6] = ValidDataLength;
      }
      v12 = 0;
      if( FileOffset.QuadPart < SharedCacheMap[1].QuadPart && (SharedCacheMap[19].anonymous_0.LowPart & 4) == 0 )
      {
        KeReleaseInStackQueuedSpinLockFromDpcLevel(&v25);
        __writecr8(v25.OldIrql);
        v12 = 0;
        if( CcUnmapVacbArray((_SHARED_CACHE_MAP *)SharedCacheMap, &FileOffset, 0i64, 0, 0) )
        {
          if( !FileOffset.QuadPart )
          {
            if( SharedCacheMap[20].QuadPart )
              CcDeleteMbcb((_SHARED_CACHE_MAP *)SharedCacheMap);
            if( (_LARGE_INTEGER *)SharedCacheMap[2].QuadPart != &SharedCacheMap[2] )
              CcDeleteBcbs((_SHARED_CACHE_MAP *)SharedCacheMap);
          }
          v12 = CcPurgeAndClearCacheSection((_SHARED_CACHE_MAP *)SharedCacheMap, &FileOffset, v14);
        }
        KeAcquireInStackQueuedSpinLock(v10, &v25);
      }
      SharedCacheMap[1] = FileOffset;
      CcDecrementOpenCount((_SHARED_CACHE_MAP *)SharedCacheMap, v8, v9);
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&v25);
      __writecr8(v25.OldIrql);
      return v12;
    }
    else
    {
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&v25);
      __writecr8(v25.OldIrql);
      return 0;
    }
  }
  else
  {
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
    if( (FileOffset.anonymous_0.LowPart & 0xFFF) == 0 )
      return CcPurgeCacheSection((INT64 *)FileObject->SectionObjectPointer, (UINT64)&FileOffset, 0i64, 0) == 0 ? 0xC0000435 : 0;
    LODWORD(v23) = 0;
    MmFlushSection(FileObject->SectionObjectPointer, &FileOffset, 1ui64, v21, &IoStatus, v23);
    result = IoStatus.Status;
    if( IoStatus.Status >= 0 )
      return CcPurgeCacheSection((INT64 *)FileObject->SectionObjectPointer, (UINT64)&FileOffset, 0i64, 0) == 0 ? 0xC0000435 : 0;
  }
  return result;
}

Referenced by:

CcSetFileSizes