[USETUP] Enhancements for filesystem utility functions.
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sat, 13 May 2017 16:20:10 +0000 (16:20 +0000)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sat, 26 May 2018 17:09:38 +0000 (19:09 +0200)
- 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
base/setup/usetup/fslist.h

index 0b190d4..1eb158b 100644 (file)
@@ -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)
index 685a2cf..4433d38 100644 (file)
@@ -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(