From 950747c6d19b0a28665b542406afcf5e5fd6de66 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sun, 23 Nov 2014 14:07:08 +0000 Subject: [PATCH 1/1] [NTFS] - Implement GetBestFileNameFromRecord() which will select the higher subsystem name available (POSIX -> Win32 -> DOS) and return it - Replace the hand-made implementation of it in dirctl functions relying on it (NtfsGetDirectoryInformation(), NtfsGetFullDirectoryInformation(), NtfsGetBothDirectoryInformation()) - Use it in NtfsMakeFCBFromDirEntry() This fixes browsing POSIX volume (and opening file) in cmd. Even though, explorer doesn't seem to be happy with such change... This doesn't fix yet the autocompletion in cmd either. svn path=/trunk/; revision=65456 --- reactos/drivers/filesystems/ntfs/attrib.c | 18 ++++++++++ reactos/drivers/filesystems/ntfs/dirctl.c | 40 +++-------------------- reactos/drivers/filesystems/ntfs/fcb.c | 2 +- reactos/drivers/filesystems/ntfs/ntfs.h | 3 ++ 4 files changed, 26 insertions(+), 37 deletions(-) diff --git a/reactos/drivers/filesystems/ntfs/attrib.c b/reactos/drivers/filesystems/ntfs/attrib.c index ac4d6419119..675a2d8d8af 100644 --- a/reactos/drivers/filesystems/ntfs/attrib.c +++ b/reactos/drivers/filesystems/ntfs/attrib.c @@ -314,4 +314,22 @@ GetFileNameFromRecord(PFILE_RECORD_HEADER FileRecord, UCHAR NameType) return NULL; } +PFILENAME_ATTRIBUTE +GetBestFileNameFromRecord(PFILE_RECORD_HEADER FileRecord) +{ + PFILENAME_ATTRIBUTE FileName; + + FileName = GetFileNameFromRecord(FileRecord, NTFS_FILE_NAME_POSIX); + if (FileName == NULL) + { + FileName = GetFileNameFromRecord(FileRecord, NTFS_FILE_NAME_WIN32); + if (FileName == NULL) + { + FileName = GetFileNameFromRecord(FileRecord, NTFS_FILE_NAME_DOS); + } + } + + return FileName; +} + /* EOF */ diff --git a/reactos/drivers/filesystems/ntfs/dirctl.c b/reactos/drivers/filesystems/ntfs/dirctl.c index 088b69fe6ef..ddf5662e80d 100644 --- a/reactos/drivers/filesystems/ntfs/dirctl.c +++ b/reactos/drivers/filesystems/ntfs/dirctl.c @@ -137,15 +137,7 @@ NtfsGetNameInformation(PDEVICE_EXTENSION DeviceExt, DPRINT("NtfsGetNameInformation() called\n"); - FileName = GetFileNameFromRecord(FileRecord, NTFS_FILE_NAME_POSIX); - if (FileName == NULL) - { - FileName = GetFileNameFromRecord(FileRecord, NTFS_FILE_NAME_WIN32); - if (FileName == NULL) - { - FileName = GetFileNameFromRecord(FileRecord, NTFS_FILE_NAME_DOS); - } - } + FileName = GetBestFileNameFromRecord(FileRecord); ASSERT(FileName != NULL); Length = FileName->NameLength * sizeof (WCHAR); @@ -173,15 +165,7 @@ NtfsGetDirectoryInformation(PDEVICE_EXTENSION DeviceExt, DPRINT("NtfsGetDirectoryInformation() called\n"); - FileName = GetFileNameFromRecord(FileRecord, NTFS_FILE_NAME_POSIX); - if (FileName == NULL) - { - FileName = GetFileNameFromRecord(FileRecord, NTFS_FILE_NAME_WIN32); - if (FileName == NULL) - { - FileName = GetFileNameFromRecord(FileRecord, NTFS_FILE_NAME_DOS); - } - } + FileName = GetBestFileNameFromRecord(FileRecord); ASSERT(FileName != NULL); Length = FileName->NameLength * sizeof (WCHAR); @@ -222,15 +206,7 @@ NtfsGetFullDirectoryInformation(PDEVICE_EXTENSION DeviceExt, DPRINT("NtfsGetFullDirectoryInformation() called\n"); - FileName = GetFileNameFromRecord(FileRecord, NTFS_FILE_NAME_POSIX); - if (FileName == NULL) - { - FileName = GetFileNameFromRecord(FileRecord, NTFS_FILE_NAME_WIN32); - if (FileName == NULL) - { - FileName = GetFileNameFromRecord(FileRecord, NTFS_FILE_NAME_DOS); - } - } + FileName = GetBestFileNameFromRecord(FileRecord); ASSERT(FileName != NULL); Length = FileName->NameLength * sizeof (WCHAR); @@ -272,15 +248,7 @@ NtfsGetBothDirectoryInformation(PDEVICE_EXTENSION DeviceExt, DPRINT("NtfsGetBothDirectoryInformation() called\n"); - FileName = GetFileNameFromRecord(FileRecord, NTFS_FILE_NAME_POSIX); - if (FileName == NULL) - { - FileName = GetFileNameFromRecord(FileRecord, NTFS_FILE_NAME_WIN32); - if (FileName == NULL) - { - FileName = GetFileNameFromRecord(FileRecord, NTFS_FILE_NAME_DOS); - } - } + FileName = GetBestFileNameFromRecord(FileRecord); ASSERT(FileName != NULL); ShortFileName = GetFileNameFromRecord(FileRecord, NTFS_FILE_NAME_DOS); diff --git a/reactos/drivers/filesystems/ntfs/fcb.c b/reactos/drivers/filesystems/ntfs/fcb.c index 7ab896bd9e5..8be70301bf3 100644 --- a/reactos/drivers/filesystems/ntfs/fcb.c +++ b/reactos/drivers/filesystems/ntfs/fcb.c @@ -396,7 +396,7 @@ NtfsMakeFCBFromDirEntry(PNTFS_VCB Vcb, DPRINT1("NtfsMakeFCBFromDirEntry(%p, %p, %wZ, %p, %p)\n", Vcb, DirectoryFCB, Name, Record, fileFCB); - FileName = GetFileNameFromRecord(Record, NTFS_FILE_NAME_WIN32); + FileName = GetBestFileNameFromRecord(Record); if (!FileName) { return STATUS_OBJECT_NAME_NOT_FOUND; // Not sure that's the best here diff --git a/reactos/drivers/filesystems/ntfs/ntfs.h b/reactos/drivers/filesystems/ntfs/ntfs.h index 39db578fe63..058fbdd8930 100644 --- a/reactos/drivers/filesystems/ntfs/ntfs.h +++ b/reactos/drivers/filesystems/ntfs/ntfs.h @@ -452,6 +452,9 @@ NtfsDumpFileAttributes(PFILE_RECORD_HEADER FileRecord); PFILENAME_ATTRIBUTE GetFileNameFromRecord(PFILE_RECORD_HEADER FileRecord, UCHAR NameType); +PFILENAME_ATTRIBUTE +GetBestFileNameFromRecord(PFILE_RECORD_HEADER FileRecord); + /* blockdev.c */ NTSTATUS -- 2.17.1