diff --git a/reactos/drivers/filesystems/ntfs/dirctl.c b/reactos/drivers/filesystems/ntfs/dirctl.c index d93b9ee42c2..30f4a659a30 100644 --- a/reactos/drivers/filesystems/ntfs/dirctl.c +++ b/reactos/drivers/filesystems/ntfs/dirctl.c @@ -35,23 +35,28 @@ /* FUNCTIONS ****************************************************************/ -static ULONGLONG +ULONGLONG NtfsGetFileSize(PDEVICE_EXTENSION DeviceExt, PFILE_RECORD_HEADER FileRecord, - PFILENAME_ATTRIBUTE FileName) + PCWSTR Stream, + ULONG StreamLength, + PULONGLONG AllocatedSize) { - ULONGLONG Size; + ULONGLONG Size = 0ULL; + ULONGLONG Allocated = 0ULL; NTSTATUS Status; PNTFS_ATTR_CONTEXT DataContext; - Size = FileName->AllocatedSize; - Status = FindAttribute(DeviceExt, FileRecord, AttributeData, L"", 0, &DataContext); + Status = FindAttribute(DeviceExt, FileRecord, AttributeData, Stream, StreamLength, &DataContext); if (NT_SUCCESS(Status)) { Size = AttributeDataLength(&DataContext->Record); + Allocated = AttributeAllocatedLength(&DataContext->Record); ReleaseAttributeContext(DataContext); } + if (AllocatedSize != NULL) *AllocatedSize = Allocated; + return Size; } @@ -130,7 +135,7 @@ NtfsGetDirectoryInformation(PDEVICE_EXTENSION DeviceExt, /* Convert file flags */ NtfsFileFlagsToAttributes(FileName->FileAttributes | StdInfo->FileAttribute, &Info->FileAttributes); - Info->EndOfFile.QuadPart = NtfsGetFileSize(DeviceExt, FileRecord, FileName); + Info->EndOfFile.QuadPart = NtfsGetFileSize(DeviceExt, FileRecord, L"", 0, NULL); Info->AllocationSize.QuadPart = ROUND_UP(Info->EndOfFile.QuadPart, DeviceExt->NtfsInfo.BytesPerCluster); Info->FileIndex = MFTIndex; @@ -180,7 +185,7 @@ NtfsGetFullDirectoryInformation(PDEVICE_EXTENSION DeviceExt, /* Convert file flags */ NtfsFileFlagsToAttributes(FileName->FileAttributes | StdInfo->FileAttribute, &Info->FileAttributes); - Info->EndOfFile.QuadPart = NtfsGetFileSize(DeviceExt, FileRecord, FileName); + Info->EndOfFile.QuadPart = NtfsGetFileSize(DeviceExt, FileRecord, L"", 0, NULL); Info->AllocationSize.QuadPart = ROUND_UP(Info->EndOfFile.QuadPart, DeviceExt->NtfsInfo.BytesPerCluster); Info->FileIndex = MFTIndex; @@ -245,7 +250,7 @@ NtfsGetBothDirectoryInformation(PDEVICE_EXTENSION DeviceExt, /* Convert file flags */ NtfsFileFlagsToAttributes(FileName->FileAttributes | StdInfo->FileAttribute, &Info->FileAttributes); - Info->EndOfFile.QuadPart = NtfsGetFileSize(DeviceExt, FileRecord, FileName); + Info->EndOfFile.QuadPart = NtfsGetFileSize(DeviceExt, FileRecord, L"", 0, NULL); Info->AllocationSize.QuadPart = ROUND_UP(Info->EndOfFile.QuadPart, DeviceExt->NtfsInfo.BytesPerCluster); Info->FileIndex = MFTIndex; @@ -362,7 +367,7 @@ NtfsQueryDirectory(PNTFS_IRP_CONTEXT IrpContext) */ if (MFTRecord == OldMFTRecord) { - DPRINT("Ignoring duplicate MFT entry 0x%x\n", MFTRecord); + DPRINT1("Ignoring duplicate MFT entry 0x%x\n", MFTRecord); Ccb->Entry++; ExFreePoolWithTag(FileRecord, TAG_NTFS); continue; diff --git a/reactos/drivers/filesystems/ntfs/fcb.c b/reactos/drivers/filesystems/ntfs/fcb.c index 8d36f14df9b..4a4d79bdb67 100644 --- a/reactos/drivers/filesystems/ntfs/fcb.c +++ b/reactos/drivers/filesystems/ntfs/fcb.c @@ -421,6 +421,7 @@ NtfsMakeFCBFromDirEntry(PNTFS_VCB Vcb, PFILENAME_ATTRIBUTE FileName; PSTANDARD_INFORMATION StdInfo; PNTFS_FCB rcFCB; + ULONGLONG Size, AllocatedSize; DPRINT1("NtfsMakeFCBFromDirEntry(%p, %p, %wZ, %p, %p, %p)\n", Vcb, DirectoryFCB, Name, Stream, Record, fileFCB); @@ -451,6 +452,8 @@ NtfsMakeFCBFromDirEntry(PNTFS_VCB Vcb, pathName[FileName->NameLength] = UNICODE_NULL; } + Size = NtfsGetFileSize(Vcb, Record, Stream, wcslen(Stream), &AllocatedSize); + rcFCB = NtfsCreateFCB(pathName, Stream, Vcb); if (!rcFCB) { @@ -459,9 +462,9 @@ NtfsMakeFCBFromDirEntry(PNTFS_VCB Vcb, memcpy(&rcFCB->Entry, FileName, FIELD_OFFSET(FILENAME_ATTRIBUTE, NameLength)); rcFCB->Entry.NameType = FileName->NameType; - rcFCB->RFCB.FileSize.QuadPart = FileName->DataSize; - rcFCB->RFCB.ValidDataLength.QuadPart = FileName->DataSize; - rcFCB->RFCB.AllocationSize.QuadPart = FileName->AllocatedSize; + rcFCB->RFCB.FileSize.QuadPart = Size; + rcFCB->RFCB.ValidDataLength.QuadPart = Size; + rcFCB->RFCB.AllocationSize.QuadPart = AllocatedSize; StdInfo = GetStandardInformationFromRecord(Record); if (StdInfo != NULL) diff --git a/reactos/drivers/filesystems/ntfs/ntfs.h b/reactos/drivers/filesystems/ntfs/ntfs.h index c4556e3fa29..38862588098 100644 --- a/reactos/drivers/filesystems/ntfs/ntfs.h +++ b/reactos/drivers/filesystems/ntfs/ntfs.h @@ -550,6 +550,13 @@ NtfsDeviceControl(PNTFS_IRP_CONTEXT IrpContext); /* dirctl.c */ +ULONGLONG +NtfsGetFileSize(PDEVICE_EXTENSION DeviceExt, + PFILE_RECORD_HEADER FileRecord, + PCWSTR Stream, + ULONG StreamLength, + PULONGLONG AllocatedSize); + NTSTATUS NtfsDirectoryControl(PNTFS_IRP_CONTEXT IrpContext);