diff --git a/reactos/ntoskrnl/cc/misc.c b/reactos/ntoskrnl/cc/misc.c new file mode 100644 index 00000000000..43df08b9317 --- /dev/null +++ b/reactos/ntoskrnl/cc/misc.c @@ -0,0 +1,56 @@ +/* INCLUDES ******************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +#define NDEBUG +#include + +/* GLOBALS *******************************************************************/ + +/* FUNCTIONS *****************************************************************/ + +VOID STDCALL +CcSetFileSizes ( + IN PFILE_OBJECT FileObject, + IN PCC_FILE_SIZES FileSizes) +{ + KIRQL oldirql; + PBCB Bcb; + PLIST_ENTRY current_entry; + PCACHE_SEGMENT current; + + DPRINT("CcSetFileSizes(FileObject %x, FileSizes %x)\n", FileObject, FileSizes); + DPRINT("AllocationSize %d, FileSize %d, ValidDataLength %d\n", + (ULONG)FileSizes->AllocationSize.QuadPart, + (ULONG)FileSizes->FileSize.QuadPart, + (ULONG)FileSizes->ValidDataLength.QuadPart); + + Bcb = ((REACTOS_COMMON_FCB_HEADER*)FileObject->FsContext)->Bcb; + + KeAcquireSpinLock(&Bcb->BcbLock, &oldirql); + + if (FileSizes->AllocationSize.QuadPart < Bcb->AllocationSize.QuadPart) + { + current_entry = Bcb->CacheSegmentListHead.Flink; + while (current_entry != &Bcb->CacheSegmentListHead) + { + current = CONTAINING_RECORD(current_entry, CACHE_SEGMENT, BcbListEntry); + current_entry = current_entry->Flink; + if (current->FileOffset > FileSizes->AllocationSize.QuadPart) + { + current_entry = current_entry->Flink; + CcRosFreeCacheSegment(Bcb, current); + } + } + } + Bcb->AllocationSize = FileSizes->AllocationSize; + Bcb->FileSize = FileSizes->FileSize; + KeReleaseSpinLock(&Bcb->BcbLock, oldirql); +} +