CcSetFileSizesEx

INT64 __fastcall CcSetFileSizesEx(FILE_OBJECT *FileObject, CC_FILE_SIZES *FileSizes){
  LARGE_INTEGER AllocationSize; 
  LARGE_INTEGER ValidDataLength; 
  _SECTION_OBJECT_POINTERS *SectionObjectPointer; 
  char v6; 
  _SHARED_CACHE_MAP *SharedCacheMap; 
  UINT64 *v8; 
  union _LARGE_INTEGER v9; 
  unsigned int v10; 
  INT64 result; 
  SINGLE_LIST_ENTRY *v12; 
  SINGLE_LIST_ENTRY *v13; 
  char v14; 
  void *Section; 
  NTSTATUS v16; 
  NTSTATUS v17; 
  NTSTATUS v18; 
  _KEVENT *v19; 
  char v20; 
  UINT64 v21; 
  _IO_STATUS_BLOCK IoStatus; 
  KLOCK_QUEUE_HANDLE v23; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  union _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(&v23, 0, sizeof(v23));
  KeAcquireInStackQueuedSpinLock(&CcMasterLock, &LockHandle);
  SectionObjectPointer = FileObject->SectionObjectPointer;
  v6 = 1;
  SharedCacheMap = (_SHARED_CACHE_MAP *)SectionObjectPointer->SharedCacheMap;
  if( SharedCacheMap && SharedCacheMap->Section )
  {
    SpinLock = (PKSPIN_LOCK)(CcGetPartition((_QWORD *)SectionObjectPointer->SharedCacheMap) + 128);
    KeAcquireInStackQueuedSpinLock(SpinLock, &v23);
    if( AllocationSize.QuadPart <= SharedCacheMap->SectionSize.QuadPart )
      goto LABEL_4;
    ++SharedCacheMap->OpenCount;
    ++SharedCacheMap->InternalRefCount;
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&v23);
    __writecr8(v23.OldIrql);
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
    NewSectionSize += 0xFFFFFi64;
    Section = SharedCacheMap->Section;
    LODWORD(NewSectionSize) = NewSectionSize & 0xFFF00000;
    v6 = 0;
    v16 = MmExtendSection(Section, &NewSectionSize, 1ui64);
    v17 = v16;
    if( v16 < 0 )
    {
      FsRtlIsNtstatusExpected((unsigned int)v16);
      if( !v20 )
        v17 = -1073741588;
    }
    else
    {
      CcExtendVacbArray(SharedCacheMap, (_LARGE_INTEGER)NewSectionSize);
      v17 = v18;
    }
    KeAcquireInStackQueuedSpinLock(SpinLock, &v23);
    CcDecrementOpenCount((INT64)SharedCacheMap);
    if( v17 < 0 )
    {
      KeReleaseInStackQueuedSpinLock(&v23);
      RtlRaiseStatus(v17);
    }
    SharedCacheMap = (_SHARED_CACHE_MAP *)FileObject->SectionObjectPointer->SharedCacheMap;
    if( SharedCacheMap )
    {
LABEL_4:
      ++SharedCacheMap->OpenCount;
      ++SharedCacheMap->InternalRefCount;
      if( v6 )
      {
        KeReleaseInStackQueuedSpinLockFromDpcLevel(&v23);
        __writecr8(v23.OldIrql);
        KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
        __writecr8(LockHandle.OldIrql);
        v8 = SpinLock;
        KeAcquireInStackQueuedSpinLock(SpinLock, &v23);
      }
      else
      {
        v8 = SpinLock;
      }
      v9 = SharedCacheMap->ValidDataLength;
      if( v9.QuadPart != 0x7FFFFFFFFFFFFFFFi64 )
      {
        if( FileOffset.QuadPart < v9.QuadPart )
          SharedCacheMap->ValidDataLength = FileOffset;
        SharedCacheMap->ValidDataGoal = ValidDataLength;
      }
      v10 = 0;
      if( FileOffset.QuadPart < SharedCacheMap->FileSize.QuadPart && (SharedCacheMap->Flags & 4) == 0 )
      {
        KeReleaseInStackQueuedSpinLockFromDpcLevel(&v23);
        __writecr8(v23.OldIrql);
        v10 = 0;
        CcUnmapVacbArray(SharedCacheMap, &FileOffset, 0i64, 0, 0);
        if( v14 )
        {
          if( !FileOffset.QuadPart )
          {
            if( SharedCacheMap->Mbcb )
              CcDeleteMbcb((SINGLE_LIST_ENTRY *)SharedCacheMap, v12, v13);
            if( SharedCacheMap->BcbList.Flink != &SharedCacheMap->BcbList )
              CcDeleteBcbs((INT64)SharedCacheMap);
          }
          v10 = CcPurgeAndClearCacheSection((INT64)SharedCacheMap, &FileOffset);
        }
        KeAcquireInStackQueuedSpinLock(v8, &v23);
      }
      SharedCacheMap->FileSize = FileOffset;
      CcDecrementOpenCount((INT64)SharedCacheMap);
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&v23);
      __writecr8(v23.OldIrql);
      return v10;
    }
    else
    {
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&v23);
      __writecr8(v23.OldIrql);
      return 0i64;
    }
  }
  else
  {
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
    if( (FileOffset.LowPart & 0xFFF) == 0 )
      return CcPurgeCacheSection(FileObject->SectionObjectPointer, &FileOffset, 0i64, 0i64) == 0 ? 0xC0000435 : 0;
    LODWORD(v21) = 0;
    MmFlushSection(FileObject->SectionObjectPointer, &FileOffset, 1ui64, v19, &IoStatus, v21);
    result = (unsigned int)IoStatus.Status;
    if( IoStatus.Status >= 0 )
      return CcPurgeCacheSection(FileObject->SectionObjectPointer, &FileOffset, 0i64, 0i64) == 0 ? 0xC0000435 : 0;
  }
  return result;
}

Referenced by:

CcSetFileSizes