From 296712e3fa105227e1bf3d235be76c8852fc6b5a Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sun, 28 Jun 2015 20:55:29 +0000 Subject: [PATCH] [NTFS] Always gather the size of the unnamed stream for directory display. This fixes file size display when there are several data streams available svn path=/trunk/; revision=68308 --- reactos/drivers/filesystems/ntfs/dirctl.c | 37 +++++++++++++++++++---- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/reactos/drivers/filesystems/ntfs/dirctl.c b/reactos/drivers/filesystems/ntfs/dirctl.c index 61a3b17360d..632d58f1b40 100644 --- a/reactos/drivers/filesystems/ntfs/dirctl.c +++ b/reactos/drivers/filesystems/ntfs/dirctl.c @@ -35,6 +35,31 @@ /* FUNCTIONS ****************************************************************/ +static ULONGLONG +NtfsGetFileSize(PFILE_RECORD_HEADER FileRecord, + PFILENAME_ATTRIBUTE FileName) +{ + ULONGLONG Size; + PNTFS_ATTR_RECORD Attribute; + + Size = FileName->AllocatedSize; + Attribute = (PNTFS_ATTR_RECORD)((ULONG_PTR)FileRecord + FileRecord->AttributeOffset); + while (Attribute < (PNTFS_ATTR_RECORD)((ULONG_PTR)FileRecord + FileRecord->BytesInUse) && + Attribute->Type != AttributeEnd) + { + if (Attribute->Type == AttributeData && Attribute->NameLength == 0) + { + Size = AttributeDataLength(Attribute); + break; + } + + Attribute = (PNTFS_ATTR_RECORD)((ULONG_PTR)Attribute + Attribute->Length); + } + + return Size; +} + + static NTSTATUS NtfsGetNameInformation(PDEVICE_EXTENSION DeviceExt, PFILE_RECORD_HEADER FileRecord, @@ -109,8 +134,8 @@ NtfsGetDirectoryInformation(PDEVICE_EXTENSION DeviceExt, /* Convert file flags */ NtfsFileFlagsToAttributes(FileName->FileAttributes | StdInfo->FileAttribute, &Info->FileAttributes); - Info->EndOfFile.QuadPart = FileName->AllocatedSize; - Info->AllocationSize.QuadPart = ROUND_UP(FileName->AllocatedSize, DeviceExt->NtfsInfo.BytesPerCluster); + Info->EndOfFile.QuadPart = NtfsGetFileSize(FileRecord, FileName); + Info->AllocationSize.QuadPart = ROUND_UP(Info->EndOfFile.QuadPart, DeviceExt->NtfsInfo.BytesPerCluster); Info->FileIndex = MFTIndex; @@ -159,8 +184,8 @@ NtfsGetFullDirectoryInformation(PDEVICE_EXTENSION DeviceExt, /* Convert file flags */ NtfsFileFlagsToAttributes(FileName->FileAttributes | StdInfo->FileAttribute, &Info->FileAttributes); - Info->EndOfFile.QuadPart = FileName->AllocatedSize; - Info->AllocationSize.QuadPart = ROUND_UP(FileName->AllocatedSize, DeviceExt->NtfsInfo.BytesPerCluster); + Info->EndOfFile.QuadPart = NtfsGetFileSize(FileRecord, FileName); + Info->AllocationSize.QuadPart = ROUND_UP(Info->EndOfFile.QuadPart, DeviceExt->NtfsInfo.BytesPerCluster); Info->FileIndex = MFTIndex; Info->EaSize = 0; @@ -224,8 +249,8 @@ NtfsGetBothDirectoryInformation(PDEVICE_EXTENSION DeviceExt, /* Convert file flags */ NtfsFileFlagsToAttributes(FileName->FileAttributes | StdInfo->FileAttribute, &Info->FileAttributes); - Info->EndOfFile.QuadPart = FileName->AllocatedSize; - Info->AllocationSize.QuadPart = ROUND_UP(FileName->AllocatedSize, DeviceExt->NtfsInfo.BytesPerCluster); + Info->EndOfFile.QuadPart = NtfsGetFileSize(FileRecord, FileName); + Info->AllocationSize.QuadPart = ROUND_UP(Info->EndOfFile.QuadPart, DeviceExt->NtfsInfo.BytesPerCluster); Info->FileIndex = MFTIndex; Info->EaSize = 0; -- 2.17.1