From cdc15f3bc5def018c82bb8807a3eef5295456e5e Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 28 Dec 2014 09:16:41 +0000 Subject: [PATCH] [USETUP] Update the on-disk partition tables immediately after modifying the in-memory tables. svn path=/trunk/; revision=65855 --- reactos/base/setup/usetup/interface/usetup.c | 47 ++++++++++++++++++-- reactos/base/setup/usetup/partlist.c | 15 ++++--- reactos/base/setup/usetup/partlist.h | 4 +- 3 files changed, 55 insertions(+), 11 deletions(-) diff --git a/reactos/base/setup/usetup/interface/usetup.c b/reactos/base/setup/usetup/interface/usetup.c index 5789b5ba09f..b468ed852ae 100644 --- a/reactos/base/setup/usetup/interface/usetup.c +++ b/reactos/base/setup/usetup/interface/usetup.c @@ -1834,6 +1834,7 @@ CreatePrimaryPartitionPage(PINPUT_RECORD Ir) ULONGLONG DiskSize; ULONGLONG SectorCount; PCHAR Unit; + NTSTATUS Status; if (PartitionList == NULL || PartitionList->CurrentDisk == NULL || @@ -1960,6 +1961,14 @@ CreatePrimaryPartitionPage(PINPUT_RECORD Ir) SectorCount, FALSE); + Status = WriteDirtyPartitions(PartitionList); + if (!NT_SUCCESS(Status)) + { + DPRINT("WriteDirtyPartitions() failed\n"); + MUIDisplayError(ERROR_WRITE_PTABLE, Ir, POPUP_WAIT_ENTER); + return QUIT_PAGE; + } + return SELECT_PARTITION_PAGE; } } @@ -1981,6 +1990,7 @@ CreateExtendedPartitionPage(PINPUT_RECORD Ir) ULONGLONG DiskSize; ULONGLONG SectorCount; PCHAR Unit; + NTSTATUS Status; if (PartitionList == NULL || PartitionList->CurrentDisk == NULL || @@ -2106,6 +2116,14 @@ CreateExtendedPartitionPage(PINPUT_RECORD Ir) CreateExtendedPartition(PartitionList, SectorCount); + Status = WriteDirtyPartitions(PartitionList); + if (!NT_SUCCESS(Status)) + { + DPRINT("WriteDirtyPartitions() failed\n"); + MUIDisplayError(ERROR_WRITE_PTABLE, Ir, POPUP_WAIT_ENTER); + return QUIT_PAGE; + } + return SELECT_PARTITION_PAGE; } } @@ -2127,6 +2145,7 @@ CreateLogicalPartitionPage(PINPUT_RECORD Ir) ULONGLONG DiskSize; ULONGLONG SectorCount; PCHAR Unit; + NTSTATUS Status; if (PartitionList == NULL || PartitionList->CurrentDisk == NULL || @@ -2252,6 +2271,14 @@ CreateLogicalPartitionPage(PINPUT_RECORD Ir) CreateLogicalPartition(PartitionList, SectorCount); + Status = WriteDirtyPartitions(PartitionList); + if (!NT_SUCCESS(Status)) + { + DPRINT("WriteDirtyPartitions() failed\n"); + MUIDisplayError(ERROR_WRITE_PTABLE, Ir, POPUP_WAIT_ENTER); + return QUIT_PAGE; + } + return SELECT_PARTITION_PAGE; } } @@ -2269,6 +2296,7 @@ DeletePartitionPage(PINPUT_RECORD Ir) ULONGLONG PartSize; PCHAR Unit; PCHAR PartType; + NTSTATUS Status; if (PartitionList == NULL || PartitionList->CurrentDisk == NULL || @@ -2421,6 +2449,14 @@ DeletePartitionPage(PINPUT_RECORD Ir) { DeleteCurrentPartition(PartitionList); + Status = WriteDirtyPartitions(PartitionList); + if (!NT_SUCCESS(Status)) + { + DPRINT("WriteDirtyPartitions() failed\n"); + MUIDisplayError(ERROR_WRITE_PTABLE, Ir, POPUP_WAIT_ENTER); + return QUIT_PAGE; + } + return SELECT_PARTITION_PAGE; } } @@ -2792,9 +2828,10 @@ FormatPartitionPage(PINPUT_RECORD Ir) CheckActiveBootPartition(PartitionList); - if (WritePartitionsToDisk(PartitionList) == FALSE) + Status = WriteDirtyPartitions(PartitionList); + if (!NT_SUCCESS(Status)) { - DPRINT("WritePartitionsToDisk() failed\n"); + DPRINT("WriteDirtyPartitions() failed\n"); MUIDisplayError(ERROR_WRITE_PTABLE, Ir, POPUP_WAIT_ENTER); return QUIT_PAGE; } @@ -3706,6 +3743,7 @@ BootLoaderPage(PINPUT_RECORD Ir) BOOLEAN InstallOnFloppy; USHORT Line = 12; WCHAR PathBuffer[MAX_PATH]; + NTSTATUS Status; CONSOLE_SetStatusText(MUIGetString(STRING_PLEASEWAIT)); @@ -3713,9 +3751,10 @@ BootLoaderPage(PINPUT_RECORD Ir) CheckActiveBootPartition(PartitionList); /* Update the partition table because we may have changed the active partition */ - if (WritePartitionsToDisk(PartitionList) == FALSE) + Status = WriteDirtyPartitions(PartitionList); + if (!NT_SUCCESS(Status)) { - DPRINT("WritePartitionsToDisk() failed\n"); + DPRINT("WriteDirtyPartitions() failed\n"); MUIDisplayError(ERROR_WRITE_PTABLE, Ir, POPUP_WAIT_ENTER); return QUIT_PAGE; } diff --git a/reactos/base/setup/usetup/partlist.c b/reactos/base/setup/usetup/partlist.c index 47a6db05378..5bb0447248d 100644 --- a/reactos/base/setup/usetup/partlist.c +++ b/reactos/base/setup/usetup/partlist.c @@ -2931,15 +2931,16 @@ WritePartitons( } -BOOLEAN -WritePartitionsToDisk( +NTSTATUS +WriteDirtyPartitions( PPARTLIST List) { PLIST_ENTRY Entry; PDISKENTRY DiskEntry; + NTSTATUS Status; if (List == NULL) - return TRUE; + return STATUS_SUCCESS; Entry = List->DiskListHead.Flink; while (Entry != &List->DiskListHead) @@ -2948,13 +2949,17 @@ WritePartitionsToDisk( if (DiskEntry->Dirty == TRUE) { - WritePartitons(List, DiskEntry); + Status = WritePartitons(List, DiskEntry); + if (!NT_SUCCESS(Status)) + return Status; + + DiskEntry->Dirty = FALSE; } Entry = Entry->Flink; } - return TRUE; + return STATUS_SUCCESS; } diff --git a/reactos/base/setup/usetup/partlist.h b/reactos/base/setup/usetup/partlist.h index a4e5871edcd..9db6c8e2840 100644 --- a/reactos/base/setup/usetup/partlist.h +++ b/reactos/base/setup/usetup/partlist.h @@ -247,8 +247,8 @@ BOOLEAN CheckForLinuxFdiskPartitions( PPARTLIST List); -BOOLEAN -WritePartitionsToDisk( +NTSTATUS +WriteDirtyPartitions( PPARTLIST List); ULONG