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;
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);
ULONG i;
PLIST_ENTRY ListEntry;
PBIOSDISKENTRY BiosDiskEntry;
+ ULONG LayoutBufferSize;
Status = NtDeviceIoControlFile (FileHandle,
NULL,
return;
}
- if (DiskGeometry.MediaType != FixedMedia)
+ if (DiskGeometry.MediaType != FixedMedia &&
+ DiskGeometry.MediaType != RemovableMedia)
{
return;
}
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);
DiskEntry->SectorsPerTrack = DiskGeometry.SectorsPerTrack;
DiskEntry->BytesPerSector = DiskGeometry.BytesPerSector;
- DPRINT ("Cylinders %d\n", DiskEntry->Cylinders);
- DPRINT ("TracksPerCylinder %d\n", DiskEntry->TracksPerCylinder);
- DPRINT ("SectorsPerTrack %d\n", DiskEntry->SectorsPerTrack);
- DPRINT ("BytesPerSector %d\n", DiskEntry->BytesPerSector);
+ DPRINT ("Cylinders %I64u\n", DiskEntry->Cylinders);
+ DPRINT ("TracksPerCylinder %I64u\n", DiskEntry->TracksPerCylinder);
+ DPRINT ("SectorsPerTrack %I64u\n", DiskEntry->SectorsPerTrack);
+ DPRINT ("BytesPerSector %I64u\n", DiskEntry->BytesPerSector);
DiskEntry->TrackSize =
(ULONGLONG)DiskGeometry.SectorsPerTrack *
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;
NULL,
0,
LayoutBuffer,
- 8192);
+ LayoutBufferSize);
if (NT_SUCCESS (Status))
{
if (LayoutBuffer->PartitionCount == 0)
List->Bottom = Bottom;
List->Line = 0;
+ List->Offset = 0;
List->TopDisk = (ULONG)-1;
List->TopPartition = (ULONG)-1;
PDISKENTRY DiskEntry)
{
PPARTENTRY PartEntry;
+ PLIST_ENTRY Entry;
CHAR LineBuffer[128];
COORD coPos;
DWORD Written;
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++)
{
0);
}
+ Entry = Entry->Flink;
}
/* Print separator line */
/* 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;
}
}
PPARTENTRY PartEntry;
PLIST_ENTRY Entry1;
PLIST_ENTRY Entry2;
- ULONG i;
+ UCHAR i;
/* Check for empty disks */
if (IsListEmpty (&List->DiskListHead))
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;
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)
{
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)
{
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;
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)
{
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)
{
}
#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))
List->ActiveBootPartitionNumber = i;
DPRINT("Found bootable partition disk %d, drive letter %c\n",
- DiskEntry->BiosDiskNumber, PartEntry->DriveLetter[i]);
+ DiskEntry->DiskNumber, PartEntry->DriveLetter[i]);
break;
}
PDRIVE_LAYOUT_INFORMATION DriveLayout;
OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK Iosb;
- WCHAR SrcPath[MAX_PATH];
WCHAR DstPath[MAX_PATH];
UNICODE_STRING Name;
HANDLE FileHandle;
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;