X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=base%2Fsetup%2Fusetup%2Fpartlist.c;h=3f8a98ab3dd21d5cb39869f8fd0845439573f8c8;hp=5c553c2f53792eed27e8316ffc9532e84b4bb56c;hb=3d2c0a805bad287bfdbb625577f95a7a14455552;hpb=c424146e2c391f1e60041606253de1bdaf728a06 diff --git a/base/setup/usetup/partlist.c b/base/setup/usetup/partlist.c index 5c553c2f537..3f8a98ab3dd 100644 --- a/base/setup/usetup/partlist.c +++ b/base/setup/usetup/partlist.c @@ -88,12 +88,12 @@ AssignDriverLetters (PPARTLIST List) PARTENTRY, ListEntry); - for (i=0; i<3; i++) + for (i=0; i<4; i++) PartEntry->DriveLetter[i] = 0; if (PartEntry->Unpartitioned == FALSE) { - for (i=0; i<3; i++) + for (i=0; i<4; i++) { if (IsContainerPartition (PartEntry->PartInfo[i].PartitionType)) continue; @@ -374,7 +374,8 @@ ScanForUnpartitionedDiskSpace (PDISKENTRY DiskEntry) PartEntry->PartInfo[j].StartingOffset.QuadPart - (LastStartingOffset + LastPartitionLength); - if (LastUnusedPartitionLength >= DiskEntry->CylinderSize) + if (PartEntry->PartInfo[j].StartingOffset.QuadPart > (LastStartingOffset + LastPartitionLength) && + LastUnusedPartitionLength >= DiskEntry->CylinderSize) { DPRINT ("Unpartitioned disk space %I64u\n", LastUnusedPartitionLength); @@ -701,6 +702,7 @@ AddDiskToList (HANDLE FileHandle, ULONG i; PLIST_ENTRY ListEntry; PBIOSDISKENTRY BiosDiskEntry; + ULONG LayoutBufferSize; Status = NtDeviceIoControlFile (FileHandle, NULL, @@ -717,7 +719,8 @@ AddDiskToList (HANDLE FileHandle, return; } - if (DiskGeometry.MediaType != FixedMedia) + if (DiskGeometry.MediaType != FixedMedia && + DiskGeometry.MediaType != RemovableMedia) { return; } @@ -835,8 +838,12 @@ AddDiskToList (HANDLE FileHandle, if (!DiskEntry->BiosFound) { +#if 0 RtlFreeHeap(ProcessHeap, 0, DiskEntry); return; +#else + DPRINT1("WARNING: Setup could not find a matching BIOS disk entry. Disk %d is not be bootable by the BIOS!\n", DiskNumber); +#endif } InitializeListHead (&DiskEntry->PartListHead); @@ -868,11 +875,17 @@ AddDiskToList (HANDLE FileHandle, GetDriverName (DiskEntry); - InsertAscendingList(&List->DiskListHead, DiskEntry, DISKENTRY, ListEntry, BiosDiskNumber); + InsertAscendingList(&List->DiskListHead, DiskEntry, DISKENTRY, ListEntry, DiskNumber); + /* + * Allocate a buffer for 26 logical drives (2 entries each == 52) + * plus the main partiton table (4 entries). Total 56 entries. + */ + LayoutBufferSize = sizeof(DRIVE_LAYOUT_INFORMATION) + + ((56 - ANYSIZE_ARRAY) * sizeof(PARTITION_INFORMATION)); LayoutBuffer = (DRIVE_LAYOUT_INFORMATION*)RtlAllocateHeap (ProcessHeap, 0, - 8192); + LayoutBufferSize); if (LayoutBuffer == NULL) { return; @@ -887,7 +900,7 @@ AddDiskToList (HANDLE FileHandle, NULL, 0, LayoutBuffer, - 8192); + LayoutBufferSize); if (NT_SUCCESS (Status)) { if (LayoutBuffer->PartitionCount == 0) @@ -937,6 +950,7 @@ CreatePartitionList (SHORT Left, List->Bottom = Bottom; List->Line = 0; + List->Offset = 0; List->TopDisk = (ULONG)-1; List->TopPartition = (ULONG)-1; @@ -1273,6 +1287,7 @@ PrintDiskData (PPARTLIST List, PDISKENTRY DiskEntry) { PPARTENTRY PartEntry; + PLIST_ENTRY Entry; CHAR LineBuffer[128]; COORD coPos; DWORD Written; @@ -1357,8 +1372,11 @@ PrintDiskData (PPARTLIST List, PrintEmptyLine (List); /* Print partition lines*/ - LIST_FOR_EACH(PartEntry, &DiskEntry->PartListHead, PARTENTRY, ListEntry) + Entry = DiskEntry->PartListHead.Flink; + while (Entry != &DiskEntry->PartListHead) { + PartEntry = CONTAINING_RECORD(Entry, PARTENTRY, ListEntry); + /* Print disk entry */ for (i=0; i<4; i++) { @@ -1381,6 +1399,7 @@ PrintDiskData (PPARTLIST List, 0); } + Entry = Entry->Flink; } /* Print separator line */ @@ -1588,11 +1607,16 @@ DrawPartitionList (PPARTLIST List) /* print list entries */ List->Line = - List->Offset; - LIST_FOR_EACH(DiskEntry, &List->DiskListHead, DISKENTRY, ListEntry) + Entry = List->DiskListHead.Flink; + while (Entry != &List->DiskListHead) { + DiskEntry = CONTAINING_RECORD (Entry, DISKENTRY, ListEntry); + /* Print disk entry */ PrintDiskData (List, DiskEntry); + + Entry = Entry->Flink; } } @@ -1604,7 +1628,7 @@ SelectPartition(PPARTLIST List, ULONG DiskNumber, ULONG PartitionNumber) PPARTENTRY PartEntry; PLIST_ENTRY Entry1; PLIST_ENTRY Entry2; - ULONG i; + UCHAR i; /* Check for empty disks */ if (IsListEmpty (&List->DiskListHead)) @@ -1956,6 +1980,8 @@ CreateNewPartition (PPARTLIST List, PartEntry->FormatState = Unformatted; PartEntry->PartInfo[0].StartingOffset.QuadPart = PartEntry->UnpartitionedOffset + DiskEntry->TrackSize; + PartEntry->PartInfo[0].HiddenSectors = + (ULONG)(PartEntry->PartInfo[0].StartingOffset.QuadPart / DiskEntry->BytesPerSector); PartEntry->PartInfo[0].PartitionLength.QuadPart = PartEntry->UnpartitionedLength - DiskEntry->TrackSize; PartEntry->PartInfo[0].PartitionType = PARTITION_ENTRY_UNUSED; @@ -1985,6 +2011,8 @@ CreateNewPartition (PPARTLIST List, PrevPartEntry->PartInfo[1].StartingOffset.QuadPart = PartEntry->PartInfo[0].StartingOffset.QuadPart - DiskEntry->TrackSize; + PrevPartEntry->PartInfo[1].HiddenSectors = + (ULONG)(PrevPartEntry->PartInfo[1].StartingOffset.QuadPart / DiskEntry->BytesPerSector); if (DiskEntry->PartListHead.Flink == &PrevPartEntry->ListEntry) { @@ -2011,6 +2039,8 @@ CreateNewPartition (PPARTLIST List, PrevPartEntry->PartInfo[1].StartingOffset.QuadPart = PartEntry->PartInfo[0].StartingOffset.QuadPart - DiskEntry->TrackSize; + PrevPartEntry->PartInfo[1].HiddenSectors = + (ULONG)(PrevPartEntry->PartInfo[1].StartingOffset.QuadPart / DiskEntry->BytesPerSector); if (DiskEntry->PartListHead.Flink == &PrevPartEntry->ListEntry) { @@ -2066,6 +2096,8 @@ CreateNewPartition (PPARTLIST List, NewPartEntry->FormatState = Unformatted; NewPartEntry->PartInfo[0].StartingOffset.QuadPart = PartEntry->UnpartitionedOffset + DiskEntry->TrackSize; + NewPartEntry->PartInfo[0].HiddenSectors = + (ULONG)(NewPartEntry->PartInfo[0].StartingOffset.QuadPart / DiskEntry->BytesPerSector); NewPartEntry->PartInfo[0].PartitionLength.QuadPart = PartitionSize - DiskEntry->TrackSize; NewPartEntry->PartInfo[0].PartitionType = PARTITION_ENTRY_UNUSED; @@ -2095,6 +2127,8 @@ CreateNewPartition (PPARTLIST List, PrevPartEntry->PartInfo[1].StartingOffset.QuadPart = NewPartEntry->PartInfo[0].StartingOffset.QuadPart - DiskEntry->TrackSize; + PrevPartEntry->PartInfo[1].HiddenSectors = + (ULONG)(PrevPartEntry->PartInfo[1].StartingOffset.QuadPart / DiskEntry->BytesPerSector); if (DiskEntry->PartListHead.Flink == &PrevPartEntry->ListEntry) { @@ -2121,6 +2155,8 @@ CreateNewPartition (PPARTLIST List, PrevPartEntry->PartInfo[1].StartingOffset.QuadPart = NewPartEntry->PartInfo[0].StartingOffset.QuadPart - DiskEntry->TrackSize; + PrevPartEntry->PartInfo[1].HiddenSectors = + (ULONG)(PrevPartEntry->PartInfo[1].StartingOffset.QuadPart / DiskEntry->BytesPerSector); if (DiskEntry->PartListHead.Flink == &PrevPartEntry->ListEntry) { @@ -2341,9 +2377,8 @@ CheckActiveBootPartition (PPARTLIST List) } #endif - DiskEntry = CONTAINING_RECORD (List->DiskListHead.Flink, - DISKENTRY, - ListEntry); + /* Choose the currently selected disk */ + DiskEntry = List->CurrentDisk; /* Check for empty partition list */ if (IsListEmpty (&DiskEntry->PartListHead)) @@ -2404,7 +2439,7 @@ CheckActiveBootPartition (PPARTLIST List) List->ActiveBootPartitionNumber = i; DPRINT("Found bootable partition disk %d, drive letter %c\n", - DiskEntry->BiosDiskNumber, PartEntry->DriveLetter[i]); + DiskEntry->DiskNumber, PartEntry->DriveLetter[i]); break; } @@ -2475,7 +2510,6 @@ WritePartitionsToDisk (PPARTLIST List) PDRIVE_LAYOUT_INFORMATION DriveLayout; OBJECT_ATTRIBUTES ObjectAttributes; IO_STATUS_BLOCK Iosb; - WCHAR SrcPath[MAX_PATH]; WCHAR DstPath[MAX_PATH]; UNICODE_STRING Name; HANDLE FileHandle; @@ -2669,30 +2703,6 @@ WritePartitionsToDisk (PPARTLIST List) DriveLayout); NtClose (FileHandle); - - /* Install MBR code if the disk is new */ - if (DiskEntry1->NewDisk == TRUE && - DiskEntry1->BiosDiskNumber == 0) - { - wcscpy (SrcPath, SourceRootPath.Buffer); - wcscat (SrcPath, L"\\loader\\dosmbr.bin"); - - DPRINT ("Install MBR bootcode: %S ==> %S\n", - SrcPath, DstPath); - - /* Install MBR bootcode */ - Status = InstallMbrBootCodeToDisk (SrcPath, - DstPath); - if (!NT_SUCCESS (Status)) - { - DPRINT1 ("InstallMbrBootCodeToDisk() failed (Status %lx)\n", - Status); - return FALSE; - } - - DiskEntry1->NewDisk = FALSE; - DiskEntry1->NoMbr = FALSE; - } } Entry1 = Entry1->Flink;