https://git.reactos.org/?p=reactos.git;a=commitdiff;h=56ea51bbe498d126a61bab93c7ae95860bd290f2
commit 56ea51bbe498d126a61bab93c7ae95860bd290f2 Author: Hermès Bélusca-Maïto <hermes.belusca-ma...@reactos.org> AuthorDate: Sat May 13 16:20:10 2017 +0000 Commit: Hermès Bélusca-Maïto <hermes.belusca-ma...@reactos.org> CommitDate: Sat May 26 19:09:38 2018 +0200 [USETUP] Enhancements for filesystem utility functions. - Introduce code that detects the filesystem of a (mounted?) partition, using NtQueryVolumeInformationFile() with FileFsAttributeInformation class, aka. rely on ReactOS itself (kernel, storage stack, filesystem drivers...) to recognize the FS on a partition that should normally be seen by the system. This currently half-works for whatever reason (to be insvestigated), while it works on Windows. - Fix few comments & a function parameter name. - Use NT string pointer types. svn path=/branches/setup_improvements/; revision=74529 --- base/setup/usetup/fslist.c | 131 ++++++++++++++++++++++++++++++++++++++++----- base/setup/usetup/fslist.h | 10 ++-- 2 files changed, 122 insertions(+), 19 deletions(-) diff --git a/base/setup/usetup/fslist.c b/base/setup/usetup/fslist.c index 0b190d4a8b..1eb158b777 100644 --- a/base/setup/usetup/fslist.c +++ b/base/setup/usetup/fslist.c @@ -35,7 +35,7 @@ VOID AddProvider( IN OUT PFILE_SYSTEM_LIST List, - IN LPCWSTR FileSystemName, + IN PCWSTR FileSystemName, IN FORMATEX FormatFunc, IN CHKDSKEX ChkdskFunc) { @@ -69,7 +69,7 @@ AddProvider( PFILE_SYSTEM_ITEM GetFileSystemByName( IN PFILE_SYSTEM_LIST List, - IN LPWSTR FileSystemName) + IN PWSTR FileSystemName) { PLIST_ENTRY ListEntry; PFILE_SYSTEM_ITEM Item; @@ -87,6 +87,80 @@ GetFileSystemByName( return NULL; } +#if 0 // FIXME: To be fully enabled when our storage stack & al. will work better! + +/* NOTE: Ripped & adapted from base/system/autochk/autochk.c */ +static NTSTATUS +_MyGetFileSystem( + IN struct _PARTENTRY* PartEntry, + IN OUT PWSTR FileSystemName, + IN SIZE_T FileSystemNameSize) +{ + NTSTATUS Status; + HANDLE FileHandle; + IO_STATUS_BLOCK IoStatusBlock; + PFILE_FS_ATTRIBUTE_INFORMATION FileFsAttribute; + UCHAR Buffer[sizeof(FILE_FS_ATTRIBUTE_INFORMATION) + MAX_PATH * sizeof(WCHAR)]; + + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING PartitionRootPath; + WCHAR PathBuffer[MAX_PATH]; + + FileFsAttribute = (PFILE_FS_ATTRIBUTE_INFORMATION)Buffer; + + /* Set PartitionRootPath */ + swprintf(PathBuffer, + // L"\\Device\\Harddisk%lu\\Partition%lu", // Should work! But because ReactOS sucks atm. it actually doesn't work!! + L"\\Device\\Harddisk%lu\\Partition%lu\\", // HACK: Use this as a temporary hack! + PartEntry->DiskEntry->DiskNumber, + PartEntry->PartitionNumber); + RtlInitUnicodeString(&PartitionRootPath, PathBuffer); + DPRINT("PartitionRootPath: %wZ\n", &PartitionRootPath); + + /* Open the partition */ + InitializeObjectAttributes(&ObjectAttributes, + &PartitionRootPath, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = NtOpenFile(&FileHandle, // PartitionHandle, + FILE_GENERIC_READ /* | SYNCHRONIZE */, + &ObjectAttributes, + &IoStatusBlock, + FILE_SHARE_READ, + 0 /* FILE_SYNCHRONOUS_IO_NONALERT */); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to open partition %wZ, Status 0x%08lx\n", &PartitionRootPath, Status); + return Status; + } + + /* Retrieve the FS attributes */ + Status = NtQueryVolumeInformationFile(FileHandle, + &IoStatusBlock, + FileFsAttribute, + sizeof(Buffer), + FileFsAttributeInformation); + NtClose(FileHandle); + + if (!NT_SUCCESS(Status)) + { + DPRINT1("NtQueryVolumeInformationFile failed for partition %wZ, Status 0x%08lx\n", &PartitionRootPath, Status); + return Status; + } + + if (FileSystemNameSize * sizeof(WCHAR) < FileFsAttribute->FileSystemNameLength + sizeof(WCHAR)) + return STATUS_BUFFER_TOO_SMALL; + + RtlCopyMemory(FileSystemName, + FileFsAttribute->FileSystemName, + FileFsAttribute->FileSystemNameLength); + FileSystemName[FileFsAttribute->FileSystemNameLength / sizeof(WCHAR)] = UNICODE_NULL; + + return STATUS_SUCCESS; +} + +#endif PFILE_SYSTEM_ITEM GetFileSystem( @@ -94,7 +168,11 @@ GetFileSystem( IN struct _PARTENTRY* PartEntry) { PFILE_SYSTEM_ITEM CurrentFileSystem; - LPWSTR FileSystemName = NULL; + PWSTR FileSystemName = NULL; +#if 0 // For code temporarily disabled below + NTSTATUS Status; + WCHAR FsRecFileSystemName[MAX_PATH]; +#endif CurrentFileSystem = PartEntry->FileSystem; @@ -106,6 +184,26 @@ GetFileSystem( CurrentFileSystem = NULL; +#if 0 // FIXME: To be fully enabled when our storage stack & al. will work better! + + /* + * We don't have one... + * + * Try to infer one using NT file system recognition. + */ + Status = _MyGetFileSystem(PartEntry, FsRecFileSystemName, ARRAYSIZE(FsRecFileSystemName)); + if (NT_SUCCESS(Status) && *FsRecFileSystemName) + { + /* Temporary HACK: map FAT32 back to FAT */ + if (wcscmp(FsRecFileSystemName, L"FAT32") == 0) + wcscpy(FsRecFileSystemName, L"FAT"); + + FileSystemName = FsRecFileSystemName; + goto Quit; + } + +#endif + /* * We don't have one... * @@ -141,12 +239,19 @@ GetFileSystem( FileSystemName = L"NTFS"; /* FIXME: Not quite correct! */ } +#if 0 +Quit: // For code temporarily disabled above +#endif + // HACK: WARNING: We cannot write on this FS yet! - if (PartEntry->PartitionType == PARTITION_EXT2 || PartEntry->PartitionType == PARTITION_IFS) - DPRINT1("Recognized file system %S that doesn't support write support yet!\n", FileSystemName); + if (FileSystemName) + { + if (PartEntry->PartitionType == PARTITION_EXT2 || PartEntry->PartitionType == PARTITION_IFS) + DPRINT1("Recognized file system %S that doesn't support write support yet!\n", FileSystemName); + } DPRINT1("GetFileSystem -- PartitionType: 0x%02X ; FileSystemName (guessed): %S\n", - PartEntry->PartitionType, FileSystemName); + PartEntry->PartitionType, FileSystemName ? FileSystemName : L"None"); if (FileSystemName != NULL) CurrentFileSystem = GetFileSystemByName(FileSystemList, FileSystemName); @@ -160,7 +265,7 @@ CreateFileSystemList( IN SHORT Left, IN SHORT Top, IN BOOLEAN ForceFormat, - IN LPCWSTR ForceFileSystem) + IN PCWSTR SelectFileSystem) { PFILE_SYSTEM_LIST List; PFILE_SYSTEM_ITEM Item; @@ -183,16 +288,16 @@ CreateFileSystemList( if (!ForceFormat) { - /* Add 'Keep' provider */ + /* Add the 'Keep existing filesystem' dummy provider */ AddProvider(List, NULL, NULL, NULL); } - /* Search for ForceFileSystem in list */ + /* Search for SelectFileSystem in list */ ListEntry = List->ListHead.Flink; while (ListEntry != &List->ListHead) { Item = CONTAINING_RECORD(ListEntry, FILE_SYSTEM_ITEM, ListEntry); - if (Item->FileSystemName && wcscmp(ForceFileSystem, Item->FileSystemName) == 0) + if (Item->FileSystemName && wcscmp(SelectFileSystem, Item->FileSystemName) == 0) { List->Selected = Item; break; @@ -205,7 +310,6 @@ CreateFileSystemList( return List; } - VOID DestroyFileSystemList( IN PFILE_SYSTEM_LIST List) @@ -226,7 +330,6 @@ DestroyFileSystemList( RtlFreeHeap(ProcessHeap, 0, List); } - VOID DrawFileSystemList( IN PFILE_SYSTEM_LIST List) @@ -264,7 +367,9 @@ DrawFileSystemList( snprintf(Buffer, sizeof(Buffer), MUIGetString(STRING_FORMATDISK2), Item->FileSystemName); } else + { snprintf(Buffer, sizeof(Buffer), MUIGetString(STRING_KEEPFORMAT)); + } if (ListEntry == &List->Selected->ListEntry) CONSOLE_SetInvertedTextXY(List->Left, @@ -279,7 +384,6 @@ DrawFileSystemList( } } - VOID ScrollDownFileSystemList( IN PFILE_SYSTEM_LIST List) @@ -291,7 +395,6 @@ ScrollDownFileSystemList( } } - VOID ScrollUpFileSystemList( IN PFILE_SYSTEM_LIST List) diff --git a/base/setup/usetup/fslist.h b/base/setup/usetup/fslist.h index 685a2cfe2e..4433d381ba 100644 --- a/base/setup/usetup/fslist.h +++ b/base/setup/usetup/fslist.h @@ -31,7 +31,7 @@ typedef struct _FILE_SYSTEM_ITEM { LIST_ENTRY ListEntry; - LPCWSTR FileSystemName; /* Not owned by the item */ + PCWSTR FileSystemName; /* Not owned by the item */ FORMATEX FormatFunc; CHKDSKEX ChkdskFunc; BOOLEAN QuickFormat; @@ -46,16 +46,16 @@ typedef struct _FILE_SYSTEM_LIST } FILE_SYSTEM_LIST, *PFILE_SYSTEM_LIST; VOID -FS_AddProvider( +AddProvider( IN OUT PFILE_SYSTEM_LIST List, - IN LPCWSTR FileSystemName, + IN PCWSTR FileSystemName, IN FORMATEX FormatFunc, IN CHKDSKEX ChkdskFunc); PFILE_SYSTEM_ITEM GetFileSystemByName( IN PFILE_SYSTEM_LIST List, - IN LPWSTR FileSystemName); + IN PWSTR FileSystemName); struct _PARTENTRY; // Defined in partlist.h PFILE_SYSTEM_ITEM @@ -68,7 +68,7 @@ CreateFileSystemList( IN SHORT Left, IN SHORT Top, IN BOOLEAN ForceFormat, - IN LPCWSTR ForceFileSystem); + IN PCWSTR SelectFileSystem); VOID DestroyFileSystemList(