Make disk partition handling architecture dependent, as not
all architectures have partitions
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/arch.S
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/boot.S
Added: trunk/reactos/boot/freeldr/freeldr/arch/i386/i386.h
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/i386disk.c
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/linux.S
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/machpc.c
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/machxbox.c
Modified: trunk/reactos/boot/freeldr/freeldr/bootmgr.c
Modified: trunk/reactos/boot/freeldr/freeldr/disk/partition.c
Modified: trunk/reactos/boot/freeldr/freeldr/fs/fs.c
Deleted: trunk/reactos/boot/freeldr/freeldr/fs/fsrec.h
Modified: trunk/reactos/boot/freeldr/freeldr/include/freeldr.h
Modified: trunk/reactos/boot/freeldr/freeldr/include/fs.h
Added: trunk/reactos/boot/freeldr/freeldr/include/fsrec.h
Modified: trunk/reactos/boot/freeldr/freeldr/include/machine.h
Modified: trunk/reactos/boot/freeldr/freeldr/inifile/ini.h
Modified: trunk/reactos/boot/freeldr/freeldr/inifile/ini_init.c
Modified: trunk/reactos/boot/freeldr/freeldr/linuxboot.c
Modified: trunk/reactos/boot/freeldr/freeldr/machine.c
Modified: trunk/reactos/boot/freeldr/freeldr/miscboot.c
Modified: trunk/reactos/boot/freeldr/freeldr/reactos/arcname.c
Modified: trunk/reactos/boot/freeldr/freeldr/reactos/reactos.c
Modified: trunk/reactos/boot/freeldr/freeldr/reactos/setupldr.c
_____
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/arch.S
--- trunk/reactos/boot/freeldr/freeldr/arch/i386/arch.S 2005-04-19
06:26:01 UTC (rev 14697)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/arch.S 2005-04-19
08:51:16 UTC (rev 14698)
@@ -47,10 +47,10 @@
.code32
/* Store the boot drive */
- movb %dl,(_BootDrive)
+ movb %dl,(_i386BootDrive)
/* Store the boot partition */
- movb %dh,(_BootPartition)
+ movb %dh,(_i386BootPartition)
/* GO! */
xorl %eax,%eax
@@ -365,12 +365,12 @@
movl MB_INFO_BOOT_DEVICE_OFFSET(%ebx),%eax
shrl $16,%eax
incb %al
- movb %al,_BootPartition
- movb %ah,_BootDrive
+ movb %al,_i386BootPartition
+ movb %ah,_i386BootDrive
jmp mb4
mb3: /* No boot device known, assume first partition of first
harddisk */
- movb $0x80,_BootDrive
- movb $1,_BootPartition
+ movb $0x80,_i386BootDrive
+ movb $1,_i386BootPartition
mb4:
/* Check for a command line */
@@ -462,8 +462,8 @@
.word 0x3ff /* Limit */
.long 0 /* Base Address */
-EXTERN(_BootDrive)
+EXTERN(_i386BootDrive)
.long 0
-EXTERN(_BootPartition)
+EXTERN(_i386BootPartition)
.long 0
_____
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/boot.S
--- trunk/reactos/boot/freeldr/freeldr/arch/i386/boot.S 2005-04-19
06:26:01 UTC (rev 14697)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/boot.S 2005-04-19
08:51:16 UTC (rev 14698)
@@ -31,7 +31,7 @@
.code16
/* Set the boot drive */
- movb (_BootDrive),%dl
+ movb (_i386BootDrive),%dl
/* Load segment registers */
cli
_____
Added: trunk/reactos/boot/freeldr/freeldr/arch/i386/i386.h
--- trunk/reactos/boot/freeldr/freeldr/arch/i386/i386.h 2005-04-19
06:26:01 UTC (rev 14697)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/i386.h 2005-04-19
08:51:16 UTC (rev 14698)
@@ -0,0 +1,40 @@
+/*
+ * FreeLoader
+ *
+ * Copyright (C) 2003 Eric Kohl
+ *
+ * This program is free software; you can redistribute it and/or
modify
+ * it under the terms of the GNU General Public License as published
by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __I386_I386_H_
+#define __I386_I386_H_
+
+
+extern ULONG i386BootDrive;
+extern ULONG i386BootPartition;
+
+extern BOOL i386DiskGetBootVolume(PULONG DriveNumber, PULONGLONG
StartSector,
+ PULONGLONG SectorCount, int *FsType);
+extern BOOL i386DiskGetSystemVolume(char *SystemPath, char
*RemainingPath,
+ PULONG Device, PULONG DriveNumber,
+ PULONGLONG StartSector,
+ PULONGLONG SectorCount, int
*FsType);
+extern BOOL i386DiskGetBootPath(char *BootPath, unsigned Size);
+extern VOID i386DiskGetBootDevice(PULONG BootDevice);
+extern BOOL i386DiskBootingFromFloppy(VOID);
+
+#endif /* __I386_I386_H_ */
+
+/* EOF */
Property changes on: trunk/reactos/boot/freeldr/freeldr/arch/i386/i386.h
___________________________________________________________________
Name: svn:keywords
+ Author Date Id Revision
Name: svn:eol-style
+ native
_____
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/i386disk.c
--- trunk/reactos/boot/freeldr/freeldr/arch/i386/i386disk.c
2005-04-19 06:26:01 UTC (rev 14697)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/i386disk.c
2005-04-19 08:51:16 UTC (rev 14698)
@@ -19,6 +19,8 @@
#include "freeldr.h"
#include "debug.h"
+#include "i386.h"
+#include "fsrec.h"
////////////////////////////////////////////////////////////////////////
/////////////////////
// FUNCTIONS
@@ -166,4 +168,244 @@
return TRUE;
}
-#endif // defined __i386__
+BOOL i386DiskGetBootVolume(PULONG DriveNumber, PULONGLONG StartSector,
PULONGLONG SectorCount, int *FsType)
+{
+ PARTITION_TABLE_ENTRY PartitionTableEntry;
+ UCHAR VolumeType;
+
+ DbgPrint((DPRINT_FILESYSTEM, "FsOpenVolume() DriveNumber: 0x%x
PartitionNumber: 0x%x\n", i386BootDrive, i386BootPartition));
+
+ // Check and see if it is a floppy drive
+ // If so then just assume FAT12 file system type
+ if (DiskIsDriveRemovable(i386BootDrive))
+ {
+ DbgPrint((DPRINT_FILESYSTEM, "Drive is a floppy diskette
drive. Assuming FAT12 file system.\n"));
+
+ *DriveNumber = i386BootDrive;
+ *StartSector = 0;
+ *SectorCount = 2 * 80 * 18; /* FIXME hardcoded for 1.44
Mb */
+ *FsType = FS_FAT;
+ return TRUE;
+ }
+
+ // Check for ISO9660 file system type
+ if (i386BootDrive >= 0x80 && FsRecIsIso9660(i386BootDrive))
+ {
+ DbgPrint((DPRINT_FILESYSTEM, "Drive is a cdrom drive.
Assuming ISO-9660 file system.\n"));
+
+ *DriveNumber = i386BootDrive;
+ *StartSector = 0;
+ *SectorCount = 0;
+ *FsType = FS_ISO9660;
+ return TRUE;
+ }
+
+ // Get the requested partition entry
+ if (i386BootPartition == 0)
+ {
+ // Partition requested was zero which means the boot
partition
+ if (! DiskGetActivePartitionEntry(i386BootDrive,
&PartitionTableEntry))
+ {
+ return FALSE;
+ }
+ }
+ else
+ {
+ // Get requested partition
+ if (! MachDiskGetPartitionEntry(i386BootDrive,
i386BootPartition, &PartitionTableEntry))
+ {
+ return FALSE;
+ }
+ }
+
+ // Check for valid partition
+ if (PartitionTableEntry.SystemIndicator ==
PARTITION_ENTRY_UNUSED)
+ {
+ return FALSE;
+ }
+
+ // Try to recognize the file system
+ if (!FsRecognizeVolume(i386BootDrive,
PartitionTableEntry.SectorCountBeforePartition, &VolumeType))
+ {
+ return FALSE;
+ }
+
+ *DriveNumber = i386BootDrive;
+ *StartSector = PartitionTableEntry.SectorCountBeforePartition;
+ *SectorCount = PartitionTableEntry.PartitionSectorCount;
+
+ //switch (PartitionTableEntry.SystemIndicator)
+ switch (VolumeType)
+ {
+ case PARTITION_FAT_12:
+ case PARTITION_FAT_16:
+ case PARTITION_HUGE:
+ case PARTITION_XINT13:
+ case PARTITION_FAT32:
+ case PARTITION_FAT32_XINT13:
+ *FsType = FS_FAT;
+ return TRUE;
+ case PARTITION_EXT2:
+ *FsType = FS_EXT2;
+ return TRUE;
+ case PARTITION_NTFS:
+ *FsType = FS_NTFS;
+ return TRUE;
+ default:
+ *FsType = 0;
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+VOID
+i386DiskGetBootDevice(PULONG BootDevice)
+{
+ ((char *)BootDevice)[0] = (char)i386BootDrive;
+ ((char *)BootDevice)[1] = (char)i386BootPartition;
+}
+
+BOOL
+i386DiskBootingFromFloppy(VOID)
+{
+ return i386BootDrive < 0x80;
+}
+
+#define IsRecognizedPartition(P) \
+ ((P) == PARTITION_FAT_12 || \
+ (P) == PARTITION_FAT_16 || \
+ (P) == PARTITION_HUGE || \
+ (P) == PARTITION_IFS || \
+ (P) == PARTITION_EXT2 || \
+ (P) == PARTITION_FAT32 || \
+ (P) == PARTITION_FAT32_XINT13 || \
+ (P) == PARTITION_XINT13)
+
+BOOL i386DiskGetSystemVolume(char *SystemPath,
+ char *RemainingPath,
+ PULONG Device,
+ PULONG DriveNumber,
+ PULONGLONG StartSector,
+ PULONGLONG SectorCount,
+ int *FsType)
+{
+ ULONG PartitionNumber;
+ PARTITION_TABLE_ENTRY PartitionTableEntry;
+ UCHAR VolumeType;
+ CHAR BootPath[256];
+ unsigned i, RosPartition;
+
+ /*
+ * Verify system path
+ */
+ if (!DissectArcPath(SystemPath, BootPath, DriveNumber,
&PartitionNumber))
+ {
+ return FALSE;
+ }
+ if (NULL != RemainingPath)
+ {
+ strcpy(RemainingPath, BootPath);
+ }
+
+ /* 0xff -> no partition table present, use whole device */
+ if (0xff == PartitionNumber)
+ {
+ PartitionTableEntry.SectorCountBeforePartition = 0;
+ i = 0xff;
+ }
+ else
+ {
+ /* recalculate the boot partition for freeldr */
+ i = 0;
+ RosPartition = 0;
+ while (1)
+ {
+ if (!MachDiskGetPartitionEntry(*DriveNumber,
++i, &PartitionTableEntry))
+ {
+ return FALSE;
+ }
+ if
(IsRecognizedPartition(PartitionTableEntry.SystemIndicator))
+ {
+ if (++RosPartition == PartitionNumber)
+ {
+ break;
+ }
+ }
+ }
+ }
+
+ /* Check for ISO9660 file system type */
+ if (*DriveNumber >= 0x80 && FsRecIsIso9660(*DriveNumber))
+ {
+ DbgPrint((DPRINT_FILESYSTEM, "Drive is a cdrom drive.
Assuming ISO-9660 file system.\n"));
+
+ if (NULL != Device)
+ {
+ ((char *)Device)[0] = (char)(*DriveNumber);
+ ((char *)Device)[1] = (char)i;
+ }
+ *StartSector = 0;
+ *SectorCount = 0;
+ *FsType = FS_ISO9660;
+ return TRUE;
+ }
+
+ if (!FsRecognizeVolume(*DriveNumber,
PartitionTableEntry.SectorCountBeforePartition, &VolumeType))
+ {
+ return FALSE;
+ }
+
+ if (NULL != Device)
+ {
+ ((char *)Device)[0] = (char)(*DriveNumber);
+ ((char *)Device)[1] = (char)i;
+ }
+ *StartSector = PartitionTableEntry.SectorCountBeforePartition;
+ *SectorCount = PartitionTableEntry.PartitionSectorCount;
+
+ switch (VolumeType)
+ {
+ case PARTITION_FAT_12:
+ case PARTITION_FAT_16:
+ case PARTITION_HUGE:
+ case PARTITION_XINT13:
+ case PARTITION_FAT32:
+ case PARTITION_FAT32_XINT13:
+ *FsType = FS_FAT;
+ return TRUE;
+ case PARTITION_EXT2:
+ *FsType = FS_EXT2;
+ return TRUE;
+ case PARTITION_NTFS:
+ *FsType = FS_NTFS;
+ return TRUE;
+ default:
+ *FsType = 0;
+ return FALSE;
+ }
+
+ return FALSE;
+}
+
+BOOL
+i386DiskGetBootPath(char *BootPath, unsigned Size)
+{
+ static char Path[] = "multi(0)disk(0)";
+ char Device[4];
+
+ itoa(i386BootDrive, Device, 10);
+ if (Size <= sizeof(Path) + 6 + strlen(Device))
+ {
+ return FALSE;
+ }
+ strcpy(BootPath, Path);
+ strcat(BootPath, MachDiskBootingFromFloppy() ? "fdisk" :
"cdrom");
+ strcat(strcat(strcat(BootPath, "("), Device), ")");
+
+ return TRUE;
+}
+
+#endif /* defined __i386__ */
+
+/* EOF */
_____
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/linux.S
--- trunk/reactos/boot/freeldr/freeldr/arch/i386/linux.S
2005-04-19 06:26:01 UTC (rev 14697)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/linux.S
2005-04-19 08:51:16 UTC (rev 14698)
@@ -30,7 +30,7 @@
.code16
/* Set the boot drive */
- movb (_BootDrive),%dl
+ movb (_i386BootDrive),%dl
/* Load segment registers */
cli
@@ -66,7 +66,7 @@
.code16
/* Set the boot drive */
- movb (_BootDrive),%dl
+ movb (_i386BootDrive),%dl
/* Load segment registers */
cli
_____
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/machpc.c
--- trunk/reactos/boot/freeldr/freeldr/arch/i386/machpc.c
2005-04-19 06:26:01 UTC (rev 14697)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/machpc.c
2005-04-19 08:51:16 UTC (rev 14698)
@@ -23,6 +23,7 @@
#include "machine.h"
#include "machpc.h"
#include "rtl.h"
+#include "i386.h"
VOID
PcMachInit(VOID)
@@ -48,6 +49,11 @@
MachVtbl.VideoSync = PcVideoSync;
MachVtbl.VideoPrepareForReactOS = PcVideoPrepareForReactOS;
MachVtbl.GetMemoryMap = PcMemGetMemoryMap;
+ MachVtbl.DiskGetBootVolume = i386DiskGetBootVolume;
+ MachVtbl.DiskGetSystemVolume = i386DiskGetSystemVolume;
+ MachVtbl.DiskGetBootPath = i386DiskGetBootPath;
+ MachVtbl.DiskGetBootDevice = i386DiskGetBootDevice;
+ MachVtbl.DiskBootingFromFloppy = i386DiskBootingFromFloppy;
MachVtbl.DiskReadLogicalSectors = PcDiskReadLogicalSectors;
MachVtbl.DiskGetPartitionEntry = PcDiskGetPartitionEntry;
MachVtbl.DiskGetDriveGeometry = PcDiskGetDriveGeometry;
_____
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/machxbox.c
--- trunk/reactos/boot/freeldr/freeldr/arch/i386/machxbox.c
2005-04-19 06:26:01 UTC (rev 14697)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/machxbox.c
2005-04-19 08:51:16 UTC (rev 14698)
@@ -21,6 +21,7 @@
#include "mm.h"
#include "machine.h"
#include "machxbox.h"
+#include "i386.h"
VOID
XboxMachInit(VOID)
@@ -46,6 +47,11 @@
MachVtbl.VideoSync = XboxVideoSync;
MachVtbl.VideoPrepareForReactOS = XboxVideoPrepareForReactOS;
MachVtbl.GetMemoryMap = XboxMemGetMemoryMap;
+ MachVtbl.DiskGetBootVolume = i386DiskGetBootVolume;
+ MachVtbl.DiskGetSystemVolume = i386DiskGetSystemVolume;
+ MachVtbl.DiskGetBootPath = i386DiskGetBootPath;
+ MachVtbl.DiskGetBootDevice = i386DiskGetBootDevice;
+ MachVtbl.DiskBootingFromFloppy = i386DiskBootingFromFloppy;
MachVtbl.DiskReadLogicalSectors = XboxDiskReadLogicalSectors;
MachVtbl.DiskGetPartitionEntry = XboxDiskGetPartitionEntry;
MachVtbl.DiskGetDriveGeometry = XboxDiskGetDriveGeometry;
_____
Modified: trunk/reactos/boot/freeldr/freeldr/bootmgr.c
--- trunk/reactos/boot/freeldr/freeldr/bootmgr.c 2005-04-19
06:26:01 UTC (rev 14697)
+++ trunk/reactos/boot/freeldr/freeldr/bootmgr.c 2005-04-19
08:51:16 UTC (rev 14698)
@@ -49,6 +49,13 @@
LONG TimeOut;
ULONG SelectedOperatingSystem;
+ if (!FsOpenBootVolume())
+ {
+ printf("Error opening boot partition for file
access.\n");
+ MachConsGetCh();
+ return;
+ }
+
if (!IniFileInitialize())
{
printf("Press any key to reboot.\n");
_____
Modified: trunk/reactos/boot/freeldr/freeldr/disk/partition.c
--- trunk/reactos/boot/freeldr/freeldr/disk/partition.c 2005-04-19
06:26:01 UTC (rev 14697)
+++ trunk/reactos/boot/freeldr/freeldr/disk/partition.c 2005-04-19
08:51:16 UTC (rev 14698)
@@ -28,7 +28,8 @@
BOOL DiskGetActivePartitionEntry(ULONG DriveNumber,
PPARTITION_TABLE_ENTRY PartitionTableEntry)
{
- ULONG BootablePartitionCount =
0;
+ ULONG BootablePartitionCount = 0;
+ ULONG ActivePartition = 0;
MASTER_BOOT_RECORD MasterBootRecord;
// Read master boot record
@@ -41,22 +42,22 @@
if (MasterBootRecord.PartitionTable[0].BootIndicator == 0x80)
{
BootablePartitionCount++;
- BootPartition = 0;
+ ActivePartition = 0;
}
if (MasterBootRecord.PartitionTable[1].BootIndicator == 0x80)
{
BootablePartitionCount++;
- BootPartition = 1;
+ ActivePartition = 1;
}
if (MasterBootRecord.PartitionTable[2].BootIndicator == 0x80)
{
BootablePartitionCount++;
- BootPartition = 2;
+ ActivePartition = 2;
}
if (MasterBootRecord.PartitionTable[3].BootIndicator == 0x80)
{
BootablePartitionCount++;
- BootPartition = 3;
+ ActivePartition = 3;
}
// Make sure there was only one bootable partition
@@ -72,7 +73,7 @@
}
// Copy the partition table entry
- RtlCopyMemory(PartitionTableEntry,
&MasterBootRecord.PartitionTable[BootPartition],
sizeof(PARTITION_TABLE_ENTRY));
+ RtlCopyMemory(PartitionTableEntry,
&MasterBootRecord.PartitionTable[ActivePartition],
sizeof(PARTITION_TABLE_ENTRY));
return TRUE;
}
_____
Modified: trunk/reactos/boot/freeldr/freeldr/fs/fs.c
--- trunk/reactos/boot/freeldr/freeldr/fs/fs.c 2005-04-19 06:26:01 UTC
(rev 14697)
+++ trunk/reactos/boot/freeldr/freeldr/fs/fs.c 2005-04-19 08:51:16 UTC
(rev 14698)
@@ -51,110 +51,78 @@
/*
*
- * BOOL FsOpenVolume(ULONG DriveNumber, ULONG PartitionNumber);
+ * BOOL FsOpenVolume(ULONG DriveNumber, ULONGLONG StartSector,
ULONGLONG SectorCount, int Type);
*
* This function is called to open a disk volume for file access.
* It must be called before any of the file functions will work.
- * It takes two parameters:
*
- * Drive: The BIOS drive number of the disk to open
- * Partition: This is zero for floppy drives.
- * If the disk is a hard disk then this specifies
- * The partition number to open (1 - 4)
- * If it is zero then it opens the active (bootable)
partition
- *
*/
-BOOL FsOpenVolume(ULONG DriveNumber, ULONG PartitionNumber)
+static BOOL FsOpenVolume(ULONG DriveNumber, ULONGLONG StartSector,
ULONGLONG SectorCount, int Type)
{
- PARTITION_TABLE_ENTRY PartitionTableEntry;
- UCHAR ErrorText[80];
- UCHAR VolumeType;
+ UCHAR ErrorText[80];
- DbgPrint((DPRINT_FILESYSTEM, "FsOpenVolume() DriveNumber: 0x%x
PartitionNumber: 0x%x\n", DriveNumber, PartitionNumber));
+ FsType = Type;
- // Check and see if it is a floppy drive
- // If so then just assume FAT12 file system type
- if (DiskIsDriveRemovable(DriveNumber))
+ switch (FsType)
{
- DbgPrint((DPRINT_FILESYSTEM, "Drive is a floppy diskette
drive. Assuming FAT12 file system.\n"));
-
- FsType = FS_FAT;
- return FatOpenVolume(DriveNumber, 0, 0);
- }
-
- // Check for ISO9660 file system type
- if (DriveNumber >= 0x80 && FsRecIsIso9660(DriveNumber))
- {
- DbgPrint((DPRINT_FILESYSTEM, "Drive is a cdrom drive.
Assuming ISO-9660 file system.\n"));
-
- FsType = FS_ISO9660;
+ case FS_FAT:
+ return FatOpenVolume(DriveNumber, StartSector,
SectorCount);
+ case FS_EXT2:
+ return Ext2OpenVolume(DriveNumber, StartSector);
+ case FS_NTFS:
+ return NtfsOpenVolume(DriveNumber, StartSector);
+ case FS_ISO9660:
return IsoOpenVolume(DriveNumber);
+ default:
+ FsType = 0;
+ sprintf(ErrorText, "Unsupported file system. Type:
0x%x", Type);
+ FileSystemError(ErrorText);
}
- // Set the boot partition
- BootPartition = PartitionNumber;
+ return FALSE;
+}
+/*
+ *
+ * BOOL FsOpenBootVolume()
+ *
+ * This function is called to open the boot disk volume for file
access.
+ * It must be called before any of the file functions will work.
+ */
+BOOL FsOpenBootVolume()
+{
+ ULONG DriveNumber;
+ ULONGLONG StartSector;
+ ULONGLONG SectorCount;
+ int Type;
- // Get the requested partition entry
- if (PartitionNumber == 0)
+ if (! MachDiskGetBootVolume(&DriveNumber, &StartSector,
&SectorCount, &Type))
{
- // Partition requested was zero which means the boot
partition
- if (DiskGetActivePartitionEntry(DriveNumber,
&PartitionTableEntry) == FALSE)
- {
- FileSystemError("No active partition.");
- return FALSE;
- }
- }
- else
- {
- // Get requested partition
- if (MachDiskGetPartitionEntry(DriveNumber,
PartitionNumber, &PartitionTableEntry) == FALSE)
- {
- FileSystemError("Partition not found.");
- return FALSE;
- }
- }
-
- // Check for valid partition
- if (PartitionTableEntry.SystemIndicator ==
PARTITION_ENTRY_UNUSED)
- {
- FileSystemError("Invalid partition.");
+ FileSystemError("Unable to locate boot partition\n");
return FALSE;
}
- // Try to recognize the file system
- if (!FsRecognizeVolume(DriveNumber,
PartitionTableEntry.SectorCountBeforePartition, &VolumeType))
- {
- FileSystemError("Unrecognized file system.");
- return FALSE;
- }
+ return FsOpenVolume(DriveNumber, StartSector, SectorCount,
Type);
+}
- //switch (PartitionTableEntry.SystemIndicator)
- switch (VolumeType)
+BOOL FsOpenSystemVolume(char *SystemPath, char *RemainingPath, PULONG
Device)
+{
+ ULONG DriveNumber;
+ ULONGLONG StartSector;
+ ULONGLONG SectorCount;
+ int Type;
+
+ if (! MachDiskGetSystemVolume(SystemPath, RemainingPath, Device,
+ &DriveNumber, &StartSector,
&SectorCount,
+ &Type))
{
- case PARTITION_FAT_12:
- case PARTITION_FAT_16:
- case PARTITION_HUGE:
- case PARTITION_XINT13:
- case PARTITION_FAT32:
- case PARTITION_FAT32_XINT13:
- FsType = FS_FAT;
- return FatOpenVolume(DriveNumber,
PartitionTableEntry.SectorCountBeforePartition,
PartitionTableEntry.PartitionSectorCount);
- case PARTITION_EXT2:
- FsType = FS_EXT2;
- return Ext2OpenVolume(DriveNumber,
PartitionTableEntry.SectorCountBeforePartition);
- case PARTITION_NTFS:
- FsType = FS_NTFS;
- return NtfsOpenVolume(DriveNumber,
PartitionTableEntry.SectorCountBeforePartition);
- default:
- FsType = 0;
- sprintf(ErrorText, "Unsupported file system. Type:
0x%x", VolumeType);
- FileSystemError(ErrorText);
+ FileSystemError("Unable to locate system partition\n");
return FALSE;
}
- return TRUE;
+ return FsOpenVolume(DriveNumber, StartSector, SectorCount,
Type);
}
+
PFILE FsOpenFile(PUCHAR FileName)
{
PFILE FileHandle = NULL;
_____
Deleted: trunk/reactos/boot/freeldr/freeldr/fs/fsrec.h
--- trunk/reactos/boot/freeldr/freeldr/fs/fsrec.h 2005-04-19
06:26:01 UTC (rev 14697)
+++ trunk/reactos/boot/freeldr/freeldr/fs/fsrec.h 2005-04-19
08:51:16 UTC (rev 14698)
@@ -1,29 +0,0 @@
-/*
- * FreeLoader
- * Copyright (C) 1998-2003 Brian Palmer <brianp(a)sginet.com>
- *
- * This program is free software; you can redistribute it and/or
modify
- * it under the terms of the GNU General Public License as published
by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef __FSREC_H
-#define __FSREC_H
-
-BOOL FsRecognizeVolume(ULONG DriveNumber, ULONG VolumeStartSector,
UCHAR* VolumeType);
-BOOL FsRecIsIso9660(ULONG DriveNumber);
-BOOL FsRecIsExt2(ULONG DriveNumber, ULONG VolumeStartSector);
-BOOL FsRecIsFat(ULONG DriveNumber, ULONG VolumeStartSector);
-BOOL FsRecIsNtfs(ULONG DriveNumber, ULONG VolumeStartSector);
-
-#endif // #defined __FSREC_H
_____
Modified: trunk/reactos/boot/freeldr/freeldr/include/freeldr.h
--- trunk/reactos/boot/freeldr/freeldr/include/freeldr.h
2005-04-19 06:26:01 UTC (rev 14697)
+++ trunk/reactos/boot/freeldr/freeldr/include/freeldr.h
2005-04-19 08:51:16 UTC (rev 14698)
@@ -38,8 +38,6 @@
#define ROUND_DOWN(N, S) ((N) & ~((S) - 1))
#define Ke386EraseFlags(x) __asm__ __volatile__("pushl $0 ;
popfl\n")
-extern ULONG BootDrive; /* BIOS boot drive, 0-A:, 1-B:, 0x80-C:,
0x81-D:, etc. */
-extern ULONG BootPartition; /* Boot Partition, 1-4 */
extern BOOL UserInterfaceUp; /* Tells us if the user interface is
displayed */
VOID BootMain(LPSTR CmdLine);
_____
Modified: trunk/reactos/boot/freeldr/freeldr/include/fs.h
--- trunk/reactos/boot/freeldr/freeldr/include/fs.h 2005-04-19
06:26:01 UTC (rev 14697)
+++ trunk/reactos/boot/freeldr/freeldr/include/fs.h 2005-04-19
08:51:16 UTC (rev 14698)
@@ -33,7 +33,8 @@
#define PFILE FILE *
VOID FileSystemError(PUCHAR ErrorString);
-BOOL FsOpenVolume(ULONG DriveNumber, ULONG PartitionNumber);
+BOOL FsOpenBootVolume();
+BOOL FsOpenSystemVolume(char *SystemPath, char *RemainingPath, PULONG
BootDevice);
PFILE FsOpenFile(PUCHAR FileName);
VOID FsCloseFile(PFILE FileHandle);
BOOL FsReadFile(PFILE FileHandle, ULONG BytesToRead, ULONG*
BytesRead, PVOID Buffer);
_____
Copied: trunk/reactos/boot/freeldr/freeldr/include/fsrec.h (from rev
14682, trunk/reactos/boot/freeldr/freeldr/fs/fsrec.h)
_____
Modified: trunk/reactos/boot/freeldr/freeldr/include/machine.h
--- trunk/reactos/boot/freeldr/freeldr/include/machine.h
2005-04-19 06:26:01 UTC (rev 14697)
+++ trunk/reactos/boot/freeldr/freeldr/include/machine.h
2005-04-19 08:51:16 UTC (rev 14698)
@@ -56,6 +56,11 @@
ULONG (*GetMemoryMap)(PBIOS_MEMORY_MAP BiosMemoryMap, ULONG
MaxMemoryMapSize);
+ BOOL (*DiskGetBootVolume)(PULONG DriveNumber, PULONGLONG StartSector,
PULONGLONG SectorCount, int *FsType);
+ BOOL (*DiskGetSystemVolume)(char *SystemPath, char *RemainingPath,
PULONG Device, PULONG DriveNumber, PULONGLONG StartSector, PULONGLONG
SectorCount, int *FsType);
+ BOOL (*DiskGetBootPath)(char *BootPath, unsigned Size);
+ VOID (*DiskGetBootDevice)(PULONG BootDevice);
+ BOOL (*DiskBootingFromFloppy)(VOID);
BOOL (*DiskReadLogicalSectors)(ULONG DriveNumber, ULONGLONG
SectorNumber, ULONG SectorCount, PVOID Buffer);
BOOL (*DiskGetPartitionEntry)(ULONG DriveNumber, ULONG
PartitionNumber, PPARTITION_TABLE_ENTRY PartitionTableEntry);
BOOL (*DiskGetDriveGeometry)(ULONG DriveNumber, PGEOMETRY
DriveGeometry);
@@ -87,6 +92,11 @@
#define MachVideoSync()
MachVtbl.VideoSync()
#define MachVideoPrepareForReactOS()
MachVtbl.VideoPrepareForReactOS()
#define MachGetMemoryMap(MMap, Size)
MachVtbl.GetMemoryMap((MMap), (Size))
+#define MachDiskGetBootVolume(Drv, Start, Cnt, FsType)
MachVtbl.DiskGetBootVolume((Drv), (Start), (Cnt), (FsType))
+#define MachDiskGetSystemVolume(SysPath, RemPath, Dev, Drv, Start, Cnt,
FsType) MachVtbl.DiskGetSystemVolume((SysPath), (RemPath), (Dev), (Drv),
(Start), (Cnt), (FsType))
+#define MachDiskGetBootPath(Path, Size)
MachVtbl.DiskGetBootPath((Path), (Size))
+#define MachDiskGetBootDevice(BootDevice)
MachVtbl.DiskGetBootDevice(BootDevice)
+#define MachDiskBootingFromFloppy()
MachVtbl.DiskBootingFromFloppy()
#define MachDiskReadLogicalSectors(Drive, Start, Count, Buf)
MachVtbl.DiskReadLogicalSectors((Drive), (Start), (Count), (Buf))
#define MachDiskGetPartitionEntry(Drive, Part, Entry)
MachVtbl.DiskGetPartitionEntry((Drive), (Part), (Entry))
#define MachDiskGetDriveGeometry(Drive, Geom)
MachVtbl.DiskGetDriveGeometry((Drive), (Geom))
_____
Modified: trunk/reactos/boot/freeldr/freeldr/inifile/ini.h
--- trunk/reactos/boot/freeldr/freeldr/inifile/ini.h 2005-04-19
06:26:01 UTC (rev 14697)
+++ trunk/reactos/boot/freeldr/freeldr/inifile/ini.h 2005-04-19
08:51:16 UTC (rev 14698)
@@ -57,7 +57,7 @@
extern ULONG IniFileSectionCount;
extern ULONG IniFileSettingCount;
-PFILE IniOpenIniFile(UCHAR BootDriveNumber, UCHAR
BootPartitionNumber);
+PFILE IniOpenIniFile();
BOOL IniParseFile(PUCHAR IniFileData, ULONG IniFileSize);
ULONG IniGetNextLineSize(PUCHAR IniFileData, ULONG
IniFileSize, ULONG CurrentOffset);
_____
Modified: trunk/reactos/boot/freeldr/freeldr/inifile/ini_init.c
--- trunk/reactos/boot/freeldr/freeldr/inifile/ini_init.c
2005-04-19 06:26:01 UTC (rev 14697)
+++ trunk/reactos/boot/freeldr/freeldr/inifile/ini_init.c
2005-04-19 08:51:16 UTC (rev 14698)
@@ -33,23 +33,8 @@
BOOL Success;
// Open freeldr.ini
- // BootDrive & BootPartition are passed
- // in from the boot sector code in the
- // DL & DH registers.
- Freeldr_Ini = IniOpenIniFile(BootDrive, BootPartition);
+ Freeldr_Ini = IniOpenIniFile();
- // If we couldn't open freeldr.ini on the partition
- // they specified in the boot sector then try
- // opening the active (boot) partition.
- if ((Freeldr_Ini == NULL) && (BootPartition != 0))
- {
- BootPartition = 0;
-
- Freeldr_Ini = IniOpenIniFile(BootDrive, BootPartition);
-
- return FALSE;
- }
-
if (Freeldr_Ini == NULL)
{
printf("Error opening freeldr.ini or file not
found.\n");
@@ -87,24 +72,10 @@
return Success;
}
-PFILE IniOpenIniFile(UCHAR BootDriveNumber, UCHAR BootPartitionNumber)
+PFILE IniOpenIniFile()
{
PFILE IniFileHandle; // File handle for freeldr.ini
- if (!FsOpenVolume(BootDriveNumber, BootPartitionNumber))
- {
- if (BootPartitionNumber == 0)
- {
- printf("Error opening active (bootable)
partition on boot drive 0x%x for file access.\n", BootDriveNumber);
- }
- else
- {
- printf("Error opening partition %d on boot drive
0x%x for file access.\n", BootPartitionNumber, BootDriveNumber);
- }
-
- return NULL;
- }
-
// Try to open freeldr.ini
IniFileHandle = FsOpenFile("freeldr.ini");
_____
Modified: trunk/reactos/boot/freeldr/freeldr/linuxboot.c
--- trunk/reactos/boot/freeldr/freeldr/linuxboot.c 2005-04-19
06:26:01 UTC (rev 14697)
+++ trunk/reactos/boot/freeldr/freeldr/linuxboot.c 2005-04-19
08:51:16 UTC (rev 14698)
@@ -40,18 +40,19 @@
PLINUX_BOOTSECTOR LinuxBootSector = NULL;
PLINUX_SETUPSECTOR LinuxSetupSector = NULL;
-ULONG SetupSectorSize = 0;
-BOOL NewStyleLinuxKernel = FALSE;
-ULONG LinuxKernelSize = 0;
-ULONG LinuxInitrdSize = 0;
-UCHAR LinuxKernelName[260];
-UCHAR LinuxInitrdName[260];
-BOOL LinuxHasInitrd = FALSE;
-UCHAR LinuxCommandLine[260] = "";
-ULONG LinuxCommandLineSize = 0;
-PVOID LinuxKernelLoadAddress = NULL;
-PVOID LinuxInitrdLoadAddress = NULL;
-UCHAR LinuxBootDescription[80];
+ULONG SetupSectorSize = 0;
+BOOL NewStyleLinuxKernel = FALSE;
+ULONG LinuxKernelSize = 0;
+ULONG LinuxInitrdSize = 0;
+UCHAR LinuxKernelName[260];
+UCHAR LinuxInitrdName[260];
+BOOL LinuxHasInitrd = FALSE;
+UCHAR LinuxCommandLine[260] = "";
+ULONG LinuxCommandLineSize = 0;
+PVOID LinuxKernelLoadAddress = NULL;
+PVOID LinuxInitrdLoadAddress = NULL;
+UCHAR LinuxBootDescription[80];
+UCHAR LinuxBootPath[260] = "";
VOID LoadAndBootLinux(PUCHAR OperatingSystemName, PUCHAR Description)
{
@@ -80,7 +81,7 @@
}
// Open the boot volume
- if (!FsOpenVolume(BootDrive, BootPartition))
+ if (!FsOpenSystemVolume(LinuxBootPath, NULL, NULL))
{
UiMessageBox("Failed to open boot drive.");
goto LinuxBootFailed;
@@ -226,8 +227,7 @@
BOOL LinuxParseIniSection(PUCHAR OperatingSystemName)
{
UCHAR SettingName[260];
- UCHAR SettingValue[260];
- ULONG SectionId;
+ ULONG SectionId;
// Find all the message box settings and run them
UiShowMessageBoxesInSection(OperatingSystemName);
@@ -240,20 +240,12 @@
return FALSE;
}
- if (!IniReadSettingByName(SectionId, "BootDrive", SettingValue,
260))
+ if (!IniReadSettingByName(SectionId, "BootPath", LinuxBootPath,
260))
{
- UiMessageBox("Boot drive not specified for selected
OS!");
+ UiMessageBox("Boot path not specified for selected
OS!");
return FALSE;
}
- BootDrive = DriveMapGetBiosDriveNumber(SettingValue);
-
- BootPartition = 0;
- if (IniReadSettingByName(SectionId, "BootPartition",
SettingValue, 260))
- {
- BootPartition = atoi(SettingValue);
- }
-
// Get the kernel name
if (!IniReadSettingByName(SectionId, "Kernel", LinuxKernelName,
260))
{
_____
Modified: trunk/reactos/boot/freeldr/freeldr/machine.c
--- trunk/reactos/boot/freeldr/freeldr/machine.c 2005-04-19
06:26:01 UTC (rev 14697)
+++ trunk/reactos/boot/freeldr/freeldr/machine.c 2005-04-19
08:51:16 UTC (rev 14698)
@@ -37,6 +37,11 @@
#undef MachVideoSync
#undef MachVideoPrepareForReactOS
#undef MachGetMemoryMap
+#undef MachDiskGetBootVolume
+#undef MachDiskGetSystemVolume
+#undef MachDiskGetBootPath
+#undef MachDiskGetBootDevice
+#undef MachDiskBootingFromFloppy
#undef MachDiskReadLogicalSectors
#undef MachDiskGetPartitionEntry
#undef MachDiskGetDriveGeometry
@@ -149,6 +154,44 @@
}
BOOL
+MachDiskGetBootVolume(PULONG DriveNumber, PULONGLONG StartSector,
PULONGLONG SectorCount, int *FsType)
+{
+ return MachVtbl.DiskGetBootVolume(DriveNumber, StartSector,
SectorCount, FsType);
+}
+
+BOOL
+MachDiskGetSystemVolume(char *SystemPath,
+ char *RemainingPath,
+ PULONG Device,
+ PULONG DriveNumber,
+ PULONGLONG StartSector,
+ PULONGLONG SectorCount,
+ int *FsType)
+{
+ return MachVtbl.DiskGetSystemVolume(SystemPath, RemainingPath,
Device,
+ DriveNumber, StartSector,
SectorCount,
+ FsType);
+}
+
+BOOL
+MachDiskGetBootPath(char *BootPath, unsigned Size)
+{
+ return MachVtbl.DiskGetBootPath(BootPath, Size);
+}
+
+VOID
+MachDiskGetBootDevice(PULONG BootDevice)
+{
+ MachVtbl.DiskGetBootDevice(BootDevice);
+}
+
+BOOL
+MachDiskBootingFromFloppy()
+{
+ return MachVtbl.DiskBootingFromFloppy();
+}
+
+BOOL
MachDiskReadLogicalSectors(ULONG DriveNumber, ULONGLONG SectorNumber,
ULONG SectorCount, PVOID Buffer)
{
return MachVtbl.DiskReadLogicalSectors(DriveNumber, SectorNumber,
SectorCount, Buffer);
_____
Modified: trunk/reactos/boot/freeldr/freeldr/miscboot.c
--- trunk/reactos/boot/freeldr/freeldr/miscboot.c 2005-04-19
06:26:01 UTC (rev 14697)
+++ trunk/reactos/boot/freeldr/freeldr/miscboot.c 2005-04-19
08:51:16 UTC (rev 14698)
@@ -33,10 +33,9 @@
{
PFILE FilePointer;
UCHAR SettingName[80];
- UCHAR SettingValue[80];
- ULONG SectionId;
+ ULONG SectionId;
UCHAR FileName[260];
- ULONG BytesRead;
+ ULONG BytesRead;
// Find all the message box settings and run them
UiShowMessageBoxesInSection(OperatingSystemName);
@@ -49,27 +48,13 @@
return;
}
- if (!IniReadSettingByName(SectionId, "BootDrive", SettingValue,
80))
- {
- UiMessageBox("Boot drive not specified for selected
OS!");
- return;
- }
-
- BootDrive = DriveMapGetBiosDriveNumber(SettingValue);
-
- BootPartition = 0;
- if (IniReadSettingByName(SectionId, "BootPartition",
SettingValue, 80))
- {
- BootPartition = atoi(SettingValue);
- }
[truncated at 1000 lines; 341 more skipped]