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@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]