https://git.reactos.org/?p=reactos.git;a=commitdiff;h=765994c9e34fc60b3b4f0…
commit 765994c9e34fc60b3b4f084cae8a3af1d7ef60c4
Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
AuthorDate: Sat Dec 23 20:17:38 2017 +0100
Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
CommitDate: Sun Oct 28 01:08:57 2018 +0200
[SETUPLIB][USETUP] Bring some suggestions from PR #59 in.
- Use OBJ_CASE_INSENSITIVE when initializing object attributes
(no actual reason why to keep case sensitivity there).
- Check the success of a RtlStringCchPrintfW call in EnumerateReactOSEntries().
- Explicitly check for returned STATUS_NOT_SUPPORTED from ChkdskPartition()
or FormatPartition(), and display an appropriate error message.
- Remove some left-over comments but also explain why I kept some
commented code (mainly for future reference).
---
base/setup/lib/bootsup.c | 50 +++++++++++++++++---------
base/setup/lib/fsutil.c | 4 ++-
base/setup/lib/setuplib.c | 6 ++--
base/setup/lib/utils/filesup.c | 4 ---
base/setup/lib/utils/partlist.c | 6 ++--
base/setup/usetup/devinst.c | 4 +--
base/setup/usetup/usetup.c | 79 ++++++++++++++++++++++++++++-------------
7 files changed, 99 insertions(+), 54 deletions(-)
diff --git a/base/setup/lib/bootsup.c b/base/setup/lib/bootsup.c
index 5f0f694779..3059d0c884 100644
--- a/base/setup/lib/bootsup.c
+++ b/base/setup/lib/bootsup.c
@@ -341,6 +341,7 @@ EnumerateReactOSEntries(
IN PBOOT_STORE_ENTRY BootEntry,
IN PVOID Parameter OPTIONAL)
{
+ NTSTATUS Status;
PENUM_REACTOS_ENTRIES_DATA Data = (PENUM_REACTOS_ENTRIES_DATA)Parameter;
PNTOS_OPTIONS Options = (PNTOS_OPTIONS)&BootEntry->OsOptions;
WCHAR SystemPath[MAX_PATH];
@@ -372,16 +373,19 @@ EnumerateReactOSEntries(
goto SkipThisEntry;
}
- RtlStringCchPrintfW(SystemPath, ARRAYSIZE(SystemPath), L"\"%s\"",
Data->ArcPath);
- if ((_wcsicmp(Options->OsLoadPath, Data->ArcPath) != 0) &&
- (_wcsicmp(Options->OsLoadPath, SystemPath) != 0))
+ if (_wcsicmp(Options->OsLoadPath, Data->ArcPath) != 0)
{
- /*
- * This entry is a ReactOS entry, but the SystemRoot
- * does not match the one we are looking for.
- */
- /* Continue the enumeration */
- goto SkipThisEntry;
+ /* Not found, retry with a quoted path */
+ Status = RtlStringCchPrintfW(SystemPath, ARRAYSIZE(SystemPath),
L"\"%s\"", Data->ArcPath);
+ if (!NT_SUCCESS(Status) || _wcsicmp(Options->OsLoadPath, SystemPath) != 0)
+ {
+ /*
+ * This entry is a ReactOS entry, but the SystemRoot
+ * does not match the one we are looking for.
+ */
+ /* Continue the enumeration */
+ goto SkipThisEntry;
+ }
}
DPRINT1(" Found a candidate Win2k3 install '%S' with ARC path
'%S'\n",
@@ -668,10 +672,9 @@ SaveBootSector(
/* Write bootsector to DstPath */
RtlInitUnicodeString(&Name, DstPath);
-
InitializeObjectAttributes(&ObjectAttributes,
&Name,
- 0,
+ OBJ_CASE_INSENSITIVE,
NULL,
NULL);
@@ -780,7 +783,6 @@ InstallMbrBootCodeToDiskHelper(
/* Read new bootsector from SrcPath */
RtlInitUnicodeString(&Name, SrcPath);
-
InitializeObjectAttributes(&ObjectAttributes,
&Name,
OBJ_CASE_INSENSITIVE,
@@ -835,7 +837,7 @@ InstallMbrBootCodeToDiskHelper(
InitializeObjectAttributes(&ObjectAttributes,
&Name,
- 0,
+ OBJ_CASE_INSENSITIVE,
NULL,
NULL);
@@ -882,6 +884,12 @@ InstallMbrBootCodeToDisk(
WCHAR DstPath[MAX_PATH];
#if 0
+ /*
+ * The DestinationDevicePathBuffer parameter has been built with
+ * the following instruction by the caller; I'm not yet sure whether
+ * I actually want this function to build the path instead, hence
+ * I keep this code here but disabled for now...
+ */
WCHAR DestinationDevicePathBuffer[MAX_PATH];
RtlStringCchPrintfW(DestinationDevicePathBuffer,
ARRAYSIZE(DestinationDevicePathBuffer),
L"\\Device\\Harddisk%d\\Partition0",
@@ -1038,7 +1046,7 @@ InstallFat12BootCodeToFloppy(
InitializeObjectAttributes(&ObjectAttributes,
&Name,
- 0,
+ OBJ_CASE_INSENSITIVE,
NULL,
NULL);
@@ -1127,6 +1135,7 @@ InstallFat16BootCode(
OBJ_CASE_INSENSITIVE,
NULL,
NULL);
+
Status = NtOpenFile(&FileHandle,
GENERIC_READ | SYNCHRONIZE,
&ObjectAttributes,
@@ -1211,6 +1220,7 @@ InstallFat16BootCodeToFile(
OBJ_CASE_INSENSITIVE,
NULL,
NULL);
+
Status = NtOpenFile(&PartitionHandle,
GENERIC_READ | SYNCHRONIZE,
&ObjectAttributes,
@@ -1224,9 +1234,10 @@ InstallFat16BootCodeToFile(
RtlInitUnicodeString(&Name, DstPath);
InitializeObjectAttributes(&ObjectAttributes,
&Name,
- 0, // OBJ_CASE_INSENSITIVE,
+ OBJ_CASE_INSENSITIVE,
NULL,
NULL);
+
Status = NtCreateFile(&FileHandle,
GENERIC_WRITE | SYNCHRONIZE,
&ObjectAttributes,
@@ -1280,6 +1291,7 @@ InstallFat16BootCodeToDisk(
OBJ_CASE_INSENSITIVE,
NULL,
NULL);
+
Status = NtOpenFile(&PartitionHandle,
GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE,
&ObjectAttributes,
@@ -1353,6 +1365,7 @@ InstallFat32BootCode(
OBJ_CASE_INSENSITIVE,
NULL,
NULL);
+
Status = NtOpenFile(&FileHandle,
GENERIC_READ | SYNCHRONIZE,
&ObjectAttributes,
@@ -1503,6 +1516,7 @@ InstallFat32BootCodeToFile(
OBJ_CASE_INSENSITIVE,
NULL,
NULL);
+
Status = NtOpenFile(&PartitionHandle,
GENERIC_READ | SYNCHRONIZE,
&ObjectAttributes,
@@ -1516,9 +1530,10 @@ InstallFat32BootCodeToFile(
RtlInitUnicodeString(&Name, DstPath);
InitializeObjectAttributes(&ObjectAttributes,
&Name,
- 0, // OBJ_CASE_INSENSITIVE,
+ OBJ_CASE_INSENSITIVE,
NULL,
NULL);
+
Status = NtCreateFile(&FileHandle,
GENERIC_WRITE | SYNCHRONIZE,
&ObjectAttributes,
@@ -1572,6 +1587,7 @@ InstallFat32BootCodeToDisk(
OBJ_CASE_INSENSITIVE,
NULL,
NULL);
+
Status = NtOpenFile(&PartitionHandle,
GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE,
&ObjectAttributes,
@@ -1721,7 +1737,7 @@ InstallBtrfsBootCodeToDisk(
InitializeObjectAttributes(&ObjectAttributes,
&Name,
- 0,
+ OBJ_CASE_INSENSITIVE,
NULL,
NULL);
diff --git a/base/setup/lib/fsutil.c b/base/setup/lib/fsutil.c
index db1f3073be..2fb61bf0ea 100644
--- a/base/setup/lib/fsutil.c
+++ b/base/setup/lib/fsutil.c
@@ -34,9 +34,11 @@
FILE_SYSTEM RegisteredFileSystems[] =
{
+ /* NOTE: The FAT formatter automatically determines
+ * whether it will use FAT-16 or FAT-32. */
{ L"FAT" , VfatFormat, VfatChkdsk },
-// { L"FAT32", VfatFormat, VfatChkdsk },
#if 0
+ { L"FAT32", VfatFormat, VfatChkdsk }, // Do we support specific FAT
sub-formats specifications?
{ L"FATX" , VfatxFormat, VfatxChkdsk },
{ L"NTFS" , NtfsFormat, NtfsChkdsk },
diff --git a/base/setup/lib/setuplib.c b/base/setup/lib/setuplib.c
index 38d5b58f1f..2d9a6bba80 100644
--- a/base/setup/lib/setuplib.c
+++ b/base/setup/lib/setuplib.c
@@ -212,8 +212,8 @@ InstallSetupInfFile(
PINICACHE UnattendCache;
PINICACHEITERATOR Iterator;
#else
- // PCWSTR CrLf = L"\r\n";
- PCSTR CrLf = "\r\n";
+ // WCHAR CrLf[] = {L'\r', L'\n'};
+ CHAR CrLf[] = {'\r', '\n'};
HANDLE FileHandle, UnattendFileHandle, SectionHandle;
FILE_STANDARD_INFORMATION FileInfo;
ULONG FileSize;
@@ -360,7 +360,7 @@ Quit:
NULL,
&IoStatusBlock,
(PVOID)CrLf,
- 2 * sizeof(CHAR), // 2 * sizeof(WCHAR),
+ sizeof(CrLf),
&FileInfo.EndOfFile,
NULL);
diff --git a/base/setup/lib/utils/filesup.c b/base/setup/lib/utils/filesup.c
index 61cc1b4c5e..7755ad38fc 100644
--- a/base/setup/lib/utils/filesup.c
+++ b/base/setup/lib/utils/filesup.c
@@ -135,7 +135,6 @@ SetupCopyFile(
LARGE_INTEGER ByteOffset;
RtlInitUnicodeString(&FileName, SourceFileName);
-
InitializeObjectAttributes(&ObjectAttributes,
&FileName,
OBJ_CASE_INSENSITIVE,
@@ -206,7 +205,6 @@ SetupCopyFile(
}
RtlInitUnicodeString(&FileName, DestinationFileName);
-
InitializeObjectAttributes(&ObjectAttributes,
&FileName,
OBJ_CASE_INSENSITIVE,
@@ -594,7 +592,6 @@ DoesPathExist(
IO_STATUS_BLOCK IoStatusBlock;
RtlInitUnicodeString(&Name, PathName);
-
InitializeObjectAttributes(&ObjectAttributes,
&Name,
OBJ_CASE_INSENSITIVE,
@@ -756,7 +753,6 @@ OpenAndMapFile(
/* Open the file */
RtlInitUnicodeString(&FileName, PathNameToFile);
-
InitializeObjectAttributes(&ObjectAttributes,
&FileName,
OBJ_CASE_INSENSITIVE,
diff --git a/base/setup/lib/utils/partlist.c b/base/setup/lib/utils/partlist.c
index d9aa3b8469..6976e1ee97 100644
--- a/base/setup/lib/utils/partlist.c
+++ b/base/setup/lib/utils/partlist.c
@@ -1249,7 +1249,7 @@ CreatePartitionList(VOID)
InitializeObjectAttributes(&ObjectAttributes,
&Name,
- 0,
+ OBJ_CASE_INSENSITIVE,
NULL,
NULL);
@@ -2777,9 +2777,10 @@ WritePartitions(
L"\\Device\\Harddisk%lu\\Partition0",
DiskEntry->DiskNumber);
RtlInitUnicodeString(&Name, DstPath);
+
InitializeObjectAttributes(&ObjectAttributes,
&Name,
- 0,
+ OBJ_CASE_INSENSITIVE,
NULL,
NULL);
@@ -2882,6 +2883,7 @@ SetMountedDeviceValue(
OBJ_CASE_INSENSITIVE,
NULL,
NULL);
+
Status = NtOpenKey(&KeyHandle,
KEY_ALL_ACCESS,
&ObjectAttributes);
diff --git a/base/setup/usetup/devinst.c b/base/setup/usetup/devinst.c
index 3a8dec424d..15483a31d0 100644
--- a/base/setup/usetup/devinst.c
+++ b/base/setup/usetup/devinst.c
@@ -107,7 +107,7 @@ InstallDriver(
/* Create service key */
RtlInitUnicodeString(&StringU, Driver);
- InitializeObjectAttributes(&ObjectAttributes, &StringU, 0, hServices, NULL);
+ InitializeObjectAttributes(&ObjectAttributes, &StringU, OBJ_CASE_INSENSITIVE,
hServices, NULL);
Status = NtCreateKey(&hService, KEY_SET_VALUE, &ObjectAttributes, 0, NULL,
REG_OPTION_NON_VOLATILE, &Disposition);
if (!NT_SUCCESS(Status))
{
@@ -218,7 +218,7 @@ InstallDevice(
NTSTATUS Status;
RtlInitUnicodeString(&DeviceIdU, DeviceId);
- InitializeObjectAttributes(&ObjectAttributes, &DeviceIdU, 0, hEnum, NULL);
+ InitializeObjectAttributes(&ObjectAttributes, &DeviceIdU,
OBJ_CASE_INSENSITIVE, hEnum, NULL);
Status = NtOpenKey(&hDeviceKey, KEY_QUERY_VALUE | KEY_SET_VALUE,
&ObjectAttributes);
if (!NT_SUCCESS(Status))
{
diff --git a/base/setup/usetup/usetup.c b/base/setup/usetup/usetup.c
index b9ba8eea2f..35d83ab2a5 100644
--- a/base/setup/usetup/usetup.c
+++ b/base/setup/usetup/usetup.c
@@ -2915,12 +2915,13 @@ SelectFileSystemPage(PINPUT_RECORD Ir)
static PAGE_NUMBER
FormatPartitionPage(PINPUT_RECORD Ir)
{
- UNICODE_STRING PartitionRootPath;
- WCHAR PathBuffer[MAX_PATH];
+ NTSTATUS Status;
PDISKENTRY DiskEntry;
PPARTENTRY PartEntry;
PFILE_SYSTEM_ITEM SelectedFileSystem;
- NTSTATUS Status;
+ UNICODE_STRING PartitionRootPath;
+ WCHAR PathBuffer[MAX_PATH];
+ CHAR Buffer[MAX_PATH];
#ifndef NDEBUG
ULONG Line;
@@ -3016,7 +3017,38 @@ FormatPartitionPage(PINPUT_RECORD Ir)
{
Status = FormatPartition(&PartitionRootPath,
SelectedFileSystem);
- if (!NT_SUCCESS(Status))
+ if (Status == STATUS_NOT_SUPPORTED)
+ {
+ sprintf(Buffer,
+ "Setup is currently unable to format a partition in
%S.\n"
+ "\n"
+ " \x07 Press ENTER to continue Setup.\n"
+ " \x07 Press F3 to quit Setup.",
+ SelectedFileSystem->FileSystem->FileSystemName);
+
+ PopupError(Buffer,
+ MUIGetString(STRING_QUITCONTINUE),
+ NULL, POPUP_WAIT_NONE);
+
+ while (TRUE)
+ {
+ CONSOLE_ConInKey(Ir);
+
+ if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x00 &&
+ Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3) /* F3 */
+ {
+ if (ConfirmQuit(Ir))
+ return QUIT_PAGE;
+ else
+ return SELECT_FILE_SYSTEM_PAGE;
+ }
+ else if (Ir->Event.KeyEvent.uChar.AsciiChar == VK_RETURN) /*
ENTER */
+ {
+ return SELECT_FILE_SYSTEM_PAGE;
+ }
+ }
+ }
+ else if (!NT_SUCCESS(Status))
{
DPRINT1("FormatPartition() failed with status 0x%08lx\n",
Status);
MUIDisplayError(ERROR_FORMATTING_PARTITION, Ir, POPUP_WAIT_ANY_KEY,
PathBuffer);
@@ -3057,13 +3089,13 @@ FormatPartitionPage(PINPUT_RECORD Ir)
static PAGE_NUMBER
CheckFileSystemPage(PINPUT_RECORD Ir)
{
+ NTSTATUS Status;
+ PDISKENTRY DiskEntry;
+ PPARTENTRY PartEntry;
PFILE_SYSTEM CurrentFileSystem;
UNICODE_STRING PartitionRootPath;
WCHAR PathBuffer[MAX_PATH];
CHAR Buffer[MAX_PATH];
- PDISKENTRY DiskEntry;
- PPARTENTRY PartEntry;
- NTSTATUS Status;
if (PartitionList == NULL)
{
@@ -3099,7 +3131,8 @@ CheckFileSystemPage(PINPUT_RECORD Ir)
return CHECK_FILE_SYSTEM_PAGE;
}
- if (CurrentFileSystem->ChkdskFunc == NULL)
+ Status = ChkdskPartition(&PartitionRootPath, CurrentFileSystem);
+ if (Status == STATUS_NOT_SUPPORTED)
{
sprintf(Buffer,
"Setup is currently unable to check a partition formatted in
%S.\n"
@@ -3131,26 +3164,22 @@ CheckFileSystemPage(PINPUT_RECORD Ir)
}
}
}
- else
+ else if (!NT_SUCCESS(Status))
{
- Status = ChkdskPartition(&PartitionRootPath, CurrentFileSystem);
- if (!NT_SUCCESS(Status))
- {
- DPRINT("ChkdskPartition() failed with status 0x%08lx\n", Status);
- // sprintf(Buffer, "Setup failed to verify the selected
partition.\n"
- sprintf(Buffer, "ChkDsk detected some disk errors.\n"
- "(Status 0x%08lx).\n", Status);
- PopupError(Buffer,
- // MUIGetString(STRING_REBOOTCOMPUTER),
- MUIGetString(STRING_CONTINUE),
- Ir, POPUP_WAIT_ENTER);
-
- // return QUIT_PAGE;
- }
+ DPRINT("ChkdskPartition() failed with status 0x%08lx\n", Status);
+ // sprintf(Buffer, "Setup failed to verify the selected partition.\n"
+ sprintf(Buffer, "ChkDsk detected some disk errors.\n"
+ "(Status 0x%08lx).\n", Status);
+ PopupError(Buffer,
+ // MUIGetString(STRING_REBOOTCOMPUTER),
+ MUIGetString(STRING_CONTINUE),
+ Ir, POPUP_WAIT_ENTER);
- PartEntry->NeedsCheck = FALSE;
- return CHECK_FILE_SYSTEM_PAGE;
+ // return QUIT_PAGE;
}
+
+ PartEntry->NeedsCheck = FALSE;
+ return CHECK_FILE_SYSTEM_PAGE;
}