diff --git a/reactos/boot/freeldr/freeldr/arch/i386/arch.S b/reactos/boot/freeldr/freeldr/arch/i386/arch.S index 5780ceaf87b..bc334ef8004 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/arch.S +++ b/reactos/boot/freeldr/freeldr/arch/i386/arch.S @@ -47,10 +47,10 @@ EXTERN(RealEntryPoint) .code32 /* Store the boot drive */ - movb %dl,(_i386BootDrive) + movb %dl,(_BootDrive) /* Store the boot partition */ - movb %dh,(_i386BootPartition) + movb %dh,(_BootPartition) /* GO! */ xorl %eax,%eax @@ -275,11 +275,9 @@ EXTERN(_DisableA20) * other boot loaders like Grub */ -#define MB_INFO_SIZE 90 #define MB_INFO_FLAGS_OFFSET 0 #define MB_INFO_BOOT_DEVICE_OFFSET 12 #define MB_INFO_COMMAND_LINE_OFFSET 16 -#define CMDLINE_SIZE 256 /* * We want to execute at 0x8000 (to be compatible with bootsector @@ -287,6 +285,7 @@ EXTERN(_DisableA20) * above 1MB. So we let Grub load us there and then relocate * ourself to 0x8000 */ +#define CMDLINE_BASE 0x7000 #define FREELDR_BASE 0x8000 #define INITIAL_BASE 0x200000 @@ -329,31 +328,6 @@ mb1: movw %dx,%ds movw %dx,%es - /* Check for valid multiboot signature */ - cmpl $MULTIBOOT_BOOTLOADER_MAGIC,%eax - jne mbfail - - /* Store multiboot info in a safe place */ - movl %ebx,%esi - movl $(mb_info + INITIAL_BASE - FREELDR_BASE),%edi - movl $MB_INFO_SIZE,%ecx - rep movsb - - /* Save commandline */ - movl MB_INFO_FLAGS_OFFSET(%ebx),%edx - testl $MB_INFO_FLAG_COMMAND_LINE,MB_INFO_FLAGS_OFFSET(%ebx) - jz mb3 - movl MB_INFO_COMMAND_LINE_OFFSET(%ebx),%esi - movl $(cmdline + INITIAL_BASE - FREELDR_BASE),%edi - movl $CMDLINE_SIZE,%ecx -mb2: lodsb - stosb - testb %al,%al - jz mb3 - dec %ecx - jnz mb2 -mb3: - /* Copy to low mem */ movl $INITIAL_BASE,%esi movl $FREELDR_BASE,%edi @@ -368,8 +342,8 @@ mb3: /* Clear prefetch queue & correct CS, * jump to low mem */ - ljmp $PMODE_CS, $mb4 -mb4: + ljmp $PMODE_CS, $mb2 +mb2: /* Reload segment selectors */ movw $PMODE_DS,%dx movw %dx,%ds @@ -379,28 +353,39 @@ mb4: movw %dx,%ss movl $STACK32ADDR,%esp - movl $mb_info,%ebx + /* Check for valid multiboot signature */ + cmpl $MULTIBOOT_BOOTLOADER_MAGIC,%eax + jne mbfail + /* See if the boot device was passed in */ movl MB_INFO_FLAGS_OFFSET(%ebx),%edx testl $MB_INFO_FLAG_BOOT_DEVICE,%edx - jz mb5 + jz mb3 /* Retrieve boot device info */ movl MB_INFO_BOOT_DEVICE_OFFSET(%ebx),%eax shrl $16,%eax incb %al - movb %al,_i386BootPartition - movb %ah,_i386BootDrive - jmp mb6 -mb5: /* No boot device known, assume first partition of first harddisk */ - movb $0x80,_i386BootDrive - movb $1,_i386BootPartition -mb6: - /* Check for command line */ - mov $cmdline,%eax - testl $MB_INFO_FLAG_COMMAND_LINE,MB_INFO_FLAGS_OFFSET(%ebx) - jnz mb7 + movb %al,_BootPartition + movb %ah,_BootDrive + jmp mb4 +mb3: /* No boot device known, assume first partition of first harddisk */ + movb $0x80,_BootDrive + movb $1,_BootPartition +mb4: + + /* Check for a command line */ xorl %eax,%eax -mb7: + testl $MB_INFO_FLAG_COMMAND_LINE,%edx + jz mb6 + /* Copy command line to low mem*/ + movl MB_INFO_COMMAND_LINE_OFFSET(%ebx),%esi + movl $CMDLINE_BASE,%edi +mb5: lodsb + stosb + testb %al,%al + jnz mb5 + movl $CMDLINE_BASE,%eax +mb6: /* GO! */ pushl %eax @@ -477,15 +462,8 @@ rmode_idtptr: .word 0x3ff /* Limit */ .long 0 /* Base Address */ -EXTERN(_i386BootDrive) +EXTERN(_BootDrive) .long 0 -EXTERN(_i386BootPartition) +EXTERN(_BootPartition) .long 0 - -.bss -mb_info: - .fill MB_INFO_SIZE, 1, 0 - -cmdline: - .fill CMDLINE_SIZE, 1, 0 diff --git a/reactos/boot/freeldr/freeldr/arch/i386/archmach.c b/reactos/boot/freeldr/freeldr/arch/i386/archmach.c index c8171b0208c..347d8f56e22 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/archmach.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/archmach.c @@ -27,7 +27,7 @@ #include "rtl.h" VOID -MachInit(char *CmdLine) +MachInit(VOID) { ULONG PciId; @@ -39,11 +39,11 @@ MachInit(char *CmdLine) PciId = READ_PORT_ULONG((ULONG*) 0xcfc); if (0x02a510de == PciId) { - XboxMachInit(CmdLine); + XboxMachInit(); } else { - PcMachInit(CmdLine); + PcMachInit(); } HalpCalibrateStallExecution(); diff --git a/reactos/boot/freeldr/freeldr/arch/i386/boot.S b/reactos/boot/freeldr/freeldr/arch/i386/boot.S index 3fb9bbb3a41..ef465851862 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/boot.S +++ b/reactos/boot/freeldr/freeldr/arch/i386/boot.S @@ -31,7 +31,7 @@ EXTERN(_ChainLoadBiosBootSectorCode) .code16 /* Set the boot drive */ - movb (_i386BootDrive),%dl + movb (_BootDrive),%dl /* Load segment registers */ cli diff --git a/reactos/boot/freeldr/freeldr/arch/i386/i386.h b/reactos/boot/freeldr/freeldr/arch/i386/i386.h deleted file mode 100644 index cb76edaf0f5..00000000000 --- a/reactos/boot/freeldr/freeldr/arch/i386/i386.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * 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 */ diff --git a/reactos/boot/freeldr/freeldr/arch/i386/i386disk.c b/reactos/boot/freeldr/freeldr/arch/i386/i386disk.c index b7b3a50587a..cc0bdb3ffc7 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/i386disk.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/i386disk.c @@ -19,8 +19,6 @@ #include "freeldr.h" #include "debug.h" -#include "i386.h" -#include "fsrec.h" ///////////////////////////////////////////////////////////////////////////////////////////// // FUNCTIONS @@ -168,244 +166,4 @@ BOOL DiskGetExtendedDriveParameters(ULONG DriveNumber, PVOID Buffer, USHORT Buff return TRUE; } -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 */ +#endif // defined __i386__ diff --git a/reactos/boot/freeldr/freeldr/arch/i386/linux.S b/reactos/boot/freeldr/freeldr/arch/i386/linux.S index 43c1c201fa2..16a5a001f2d 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/linux.S +++ b/reactos/boot/freeldr/freeldr/arch/i386/linux.S @@ -30,7 +30,7 @@ EXTERN(_BootNewLinuxKernel) .code16 /* Set the boot drive */ - movb (_i386BootDrive),%dl + movb (_BootDrive),%dl /* Load segment registers */ cli @@ -66,7 +66,7 @@ EXTERN(_BootOldLinuxKernel) .code16 /* Set the boot drive */ - movb (_i386BootDrive),%dl + movb (_BootDrive),%dl /* Load segment registers */ cli diff --git a/reactos/boot/freeldr/freeldr/arch/i386/machpc.c b/reactos/boot/freeldr/freeldr/arch/i386/machpc.c index 8bbe0cadbc8..0a6fa2840ed 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/machpc.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/machpc.c @@ -23,10 +23,9 @@ #include "machine.h" #include "machpc.h" #include "rtl.h" -#include "i386.h" VOID -PcMachInit(char *CmdLine) +PcMachInit(VOID) { EnableA20(); @@ -49,11 +48,6 @@ PcMachInit(char *CmdLine) 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; diff --git a/reactos/boot/freeldr/freeldr/arch/i386/machpc.h b/reactos/boot/freeldr/freeldr/arch/i386/machpc.h index 7a2a6eb58b8..5462a10effa 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/machpc.h +++ b/reactos/boot/freeldr/freeldr/arch/i386/machpc.h @@ -26,7 +26,7 @@ #include "mm.h" #endif -VOID PcMachInit(char *CmdLine); +VOID PcMachInit(VOID); VOID PcConsPutChar(int Ch); BOOL PcConsKbHit(); diff --git a/reactos/boot/freeldr/freeldr/arch/i386/machxbox.c b/reactos/boot/freeldr/freeldr/arch/i386/machxbox.c index bbb3ca86f44..dd44d36ab73 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/machxbox.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/machxbox.c @@ -21,10 +21,9 @@ #include "mm.h" #include "machine.h" #include "machxbox.h" -#include "i386.h" VOID -XboxMachInit(char *CmdLine) +XboxMachInit(VOID) { /* Initialize our stuff */ XboxMemInit(); @@ -47,11 +46,6 @@ XboxMachInit(char *CmdLine) 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; diff --git a/reactos/boot/freeldr/freeldr/arch/i386/machxbox.h b/reactos/boot/freeldr/freeldr/arch/i386/machxbox.h index d82cdc8f246..845f242e8b0 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/machxbox.h +++ b/reactos/boot/freeldr/freeldr/arch/i386/machxbox.h @@ -26,7 +26,7 @@ UCHAR XboxFont8x16[256 * 16]; -VOID XboxMachInit(char *CmdLine); +VOID XboxMachInit(VOID); VOID XboxConsPutChar(int Ch); BOOL XboxConsKbHit(); diff --git a/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c b/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c index 071ec9ebe17..b5405cc2864 100644 --- a/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c +++ b/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c @@ -279,7 +279,7 @@ void PpcInit( of_proxy the_ofproxy ) { BootMain("freeldr-ppc"); } -void MachInit(char *CmdLine) { +void MachInit() { int len; printf( "Determining boot device:\n" ); len = ofw_getprop(chosen_package, "bootpath", diff --git a/reactos/boot/freeldr/freeldr/bootmgr.c b/reactos/boot/freeldr/freeldr/bootmgr.c index fa7f3a47e23..01cd5212462 100644 --- a/reactos/boot/freeldr/freeldr/bootmgr.c +++ b/reactos/boot/freeldr/freeldr/bootmgr.c @@ -49,13 +49,6 @@ VOID RunLoader(VOID) 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"); diff --git a/reactos/boot/freeldr/freeldr/disk/partition.c b/reactos/boot/freeldr/freeldr/disk/partition.c index 42d1f0ab6de..4c1aa01c035 100644 --- a/reactos/boot/freeldr/freeldr/disk/partition.c +++ b/reactos/boot/freeldr/freeldr/disk/partition.c @@ -28,8 +28,7 @@ BOOL DiskGetActivePartitionEntry(ULONG DriveNumber, PPARTITION_TABLE_ENTRY PartitionTableEntry) { - ULONG BootablePartitionCount = 0; - ULONG ActivePartition = 0; + ULONG BootablePartitionCount = 0; MASTER_BOOT_RECORD MasterBootRecord; // Read master boot record @@ -42,22 +41,22 @@ BOOL DiskGetActivePartitionEntry(ULONG DriveNumber, PPARTITION_TABLE_ENTRY Parti if (MasterBootRecord.PartitionTable[0].BootIndicator == 0x80) { BootablePartitionCount++; - ActivePartition = 0; + BootPartition = 0; } if (MasterBootRecord.PartitionTable[1].BootIndicator == 0x80) { BootablePartitionCount++; - ActivePartition = 1; + BootPartition = 1; } if (MasterBootRecord.PartitionTable[2].BootIndicator == 0x80) { BootablePartitionCount++; - ActivePartition = 2; + BootPartition = 2; } if (MasterBootRecord.PartitionTable[3].BootIndicator == 0x80) { BootablePartitionCount++; - ActivePartition = 3; + BootPartition = 3; } // Make sure there was only one bootable partition @@ -73,7 +72,7 @@ BOOL DiskGetActivePartitionEntry(ULONG DriveNumber, PPARTITION_TABLE_ENTRY Parti } // Copy the partition table entry - RtlCopyMemory(PartitionTableEntry, &MasterBootRecord.PartitionTable[ActivePartition], sizeof(PARTITION_TABLE_ENTRY)); + RtlCopyMemory(PartitionTableEntry, &MasterBootRecord.PartitionTable[BootPartition], sizeof(PARTITION_TABLE_ENTRY)); return TRUE; } diff --git a/reactos/boot/freeldr/freeldr/freeldr.c b/reactos/boot/freeldr/freeldr/freeldr.c index 0a2259a67c9..d1a6b5675de 100644 --- a/reactos/boot/freeldr/freeldr/freeldr.c +++ b/reactos/boot/freeldr/freeldr/freeldr.c @@ -31,7 +31,7 @@ VOID BootMain(char *CmdLine) { CmdLineParse(CmdLine); - MachInit(CmdLine); + MachInit(); DebugInit(); diff --git a/reactos/boot/freeldr/freeldr/fs/fs.c b/reactos/boot/freeldr/freeldr/fs/fs.c index 7bb4488e560..c91813f95d6 100644 --- a/reactos/boot/freeldr/freeldr/fs/fs.c +++ b/reactos/boot/freeldr/freeldr/fs/fs.c @@ -51,78 +51,110 @@ VOID FileSystemError(PUCHAR ErrorString) /* * - * BOOL FsOpenVolume(ULONG DriveNumber, ULONGLONG StartSector, ULONGLONG SectorCount, int Type); + * BOOL FsOpenVolume(ULONG DriveNumber, ULONG PartitionNumber); * * 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 * */ -static BOOL FsOpenVolume(ULONG DriveNumber, ULONGLONG StartSector, ULONGLONG SectorCount, int Type) +BOOL FsOpenVolume(ULONG DriveNumber, ULONG PartitionNumber) { - UCHAR ErrorText[80]; + PARTITION_TABLE_ENTRY PartitionTableEntry; + UCHAR ErrorText[80]; + UCHAR VolumeType; - FsType = Type; + DbgPrint((DPRINT_FILESYSTEM, "FsOpenVolume() DriveNumber: 0x%x PartitionNumber: 0x%x\n", DriveNumber, PartitionNumber)); - switch (FsType) + // Check and see if it is a floppy drive + // If so then just assume FAT12 file system type + if (DiskIsDriveRemovable(DriveNumber)) { - 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: + 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; return IsoOpenVolume(DriveNumber); + } + + // Set the boot partition + BootPartition = PartitionNumber; + + // Get the requested partition entry + if (PartitionNumber == 0) + { + // 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."); + return FALSE; + } + + // Try to recognize the file system + if (!FsRecognizeVolume(DriveNumber, PartitionTableEntry.SectorCountBeforePartition, &VolumeType)) + { + FileSystemError("Unrecognized file system."); + return FALSE; + } + + //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 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", Type); + sprintf(ErrorText, "Unsupported file system. Type: 0x%x", VolumeType); FileSystemError(ErrorText); - } - - 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; - - if (! MachDiskGetBootVolume(&DriveNumber, &StartSector, &SectorCount, &Type)) - { - FileSystemError("Unable to locate boot partition\n"); return FALSE; } - return FsOpenVolume(DriveNumber, StartSector, SectorCount, Type); + return TRUE; } -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)) - { - FileSystemError("Unable to locate system partition\n"); - return FALSE; - } - - return FsOpenVolume(DriveNumber, StartSector, SectorCount, Type); -} - - PFILE FsOpenFile(PUCHAR FileName) { PFILE FileHandle = NULL; diff --git a/reactos/boot/freeldr/freeldr/include/fsrec.h b/reactos/boot/freeldr/freeldr/fs/fsrec.h similarity index 100% rename from reactos/boot/freeldr/freeldr/include/fsrec.h rename to reactos/boot/freeldr/freeldr/fs/fsrec.h diff --git a/reactos/boot/freeldr/freeldr/include/freeldr.h b/reactos/boot/freeldr/freeldr/include/freeldr.h index c9082ae75ae..3b41ac30190 100644 --- a/reactos/boot/freeldr/freeldr/include/freeldr.h +++ b/reactos/boot/freeldr/freeldr/include/freeldr.h @@ -38,6 +38,8 @@ #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); diff --git a/reactos/boot/freeldr/freeldr/include/fs.h b/reactos/boot/freeldr/freeldr/include/fs.h index 2af910ee4a8..6b2d57d774a 100644 --- a/reactos/boot/freeldr/freeldr/include/fs.h +++ b/reactos/boot/freeldr/freeldr/include/fs.h @@ -33,8 +33,7 @@ #define PFILE FILE * VOID FileSystemError(PUCHAR ErrorString); -BOOL FsOpenBootVolume(); -BOOL FsOpenSystemVolume(char *SystemPath, char *RemainingPath, PULONG BootDevice); +BOOL FsOpenVolume(ULONG DriveNumber, ULONG PartitionNumber); PFILE FsOpenFile(PUCHAR FileName); VOID FsCloseFile(PFILE FileHandle); BOOL FsReadFile(PFILE FileHandle, ULONG BytesToRead, ULONG* BytesRead, PVOID Buffer); diff --git a/reactos/boot/freeldr/freeldr/include/machine.h b/reactos/boot/freeldr/freeldr/include/machine.h index 5879d2ef466..2642ed57f8e 100644 --- a/reactos/boot/freeldr/freeldr/include/machine.h +++ b/reactos/boot/freeldr/freeldr/include/machine.h @@ -56,11 +56,6 @@ typedef struct tagMACHVTBL 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); @@ -71,7 +66,7 @@ typedef struct tagMACHVTBL VOID (*HwDetect)(VOID); } MACHVTBL, *PMACHVTBL; -VOID MachInit(char *CmdLine); +VOID MachInit(VOID); extern MACHVTBL MachVtbl; @@ -92,11 +87,6 @@ extern MACHVTBL MachVtbl; #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)) diff --git a/reactos/boot/freeldr/freeldr/inifile/ini.h b/reactos/boot/freeldr/freeldr/inifile/ini.h index 64bd0388a50..98a74967d33 100644 --- a/reactos/boot/freeldr/freeldr/inifile/ini.h +++ b/reactos/boot/freeldr/freeldr/inifile/ini.h @@ -57,7 +57,7 @@ extern PINI_SECTION IniFileSectionListHead; extern ULONG IniFileSectionCount; extern ULONG IniFileSettingCount; -PFILE IniOpenIniFile(); +PFILE IniOpenIniFile(UCHAR BootDriveNumber, UCHAR BootPartitionNumber); BOOL IniParseFile(PUCHAR IniFileData, ULONG IniFileSize); ULONG IniGetNextLineSize(PUCHAR IniFileData, ULONG IniFileSize, ULONG CurrentOffset); diff --git a/reactos/boot/freeldr/freeldr/inifile/ini_init.c b/reactos/boot/freeldr/freeldr/inifile/ini_init.c index b145c116dcc..046133e4c1b 100644 --- a/reactos/boot/freeldr/freeldr/inifile/ini_init.c +++ b/reactos/boot/freeldr/freeldr/inifile/ini_init.c @@ -33,7 +33,22 @@ BOOL IniFileInitialize(VOID) BOOL Success; // Open freeldr.ini - Freeldr_Ini = IniOpenIniFile(); + // BootDrive & BootPartition are passed + // in from the boot sector code in the + // DL & DH registers. + Freeldr_Ini = IniOpenIniFile(BootDrive, BootPartition); + + // 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) { @@ -72,10 +87,24 @@ BOOL IniFileInitialize(VOID) return Success; } -PFILE IniOpenIniFile() +PFILE IniOpenIniFile(UCHAR BootDriveNumber, UCHAR BootPartitionNumber) { 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"); diff --git a/reactos/boot/freeldr/freeldr/linuxboot.c b/reactos/boot/freeldr/freeldr/linuxboot.c index 255c9ea4820..fa1df78f337 100644 --- a/reactos/boot/freeldr/freeldr/linuxboot.c +++ b/reactos/boot/freeldr/freeldr/linuxboot.c @@ -40,19 +40,18 @@ 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]; -UCHAR LinuxBootPath[260] = ""; +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]; VOID LoadAndBootLinux(PUCHAR OperatingSystemName, PUCHAR Description) { @@ -81,7 +80,7 @@ VOID LoadAndBootLinux(PUCHAR OperatingSystemName, PUCHAR Description) } // Open the boot volume - if (!FsOpenSystemVolume(LinuxBootPath, NULL, NULL)) + if (!FsOpenVolume(BootDrive, BootPartition)) { UiMessageBox("Failed to open boot drive."); goto LinuxBootFailed; @@ -227,7 +226,8 @@ LinuxBootFailed: BOOL LinuxParseIniSection(PUCHAR OperatingSystemName) { UCHAR SettingName[260]; - ULONG SectionId; + UCHAR SettingValue[260]; + ULONG SectionId; // Find all the message box settings and run them UiShowMessageBoxesInSection(OperatingSystemName); @@ -240,12 +240,20 @@ BOOL LinuxParseIniSection(PUCHAR OperatingSystemName) return FALSE; } - if (!IniReadSettingByName(SectionId, "BootPath", LinuxBootPath, 260)) + if (!IniReadSettingByName(SectionId, "BootDrive", SettingValue, 260)) { - UiMessageBox("Boot path not specified for selected OS!"); + UiMessageBox("Boot drive 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)) { diff --git a/reactos/boot/freeldr/freeldr/machine.c b/reactos/boot/freeldr/freeldr/machine.c index 99146d6c249..520769e3b06 100644 --- a/reactos/boot/freeldr/freeldr/machine.c +++ b/reactos/boot/freeldr/freeldr/machine.c @@ -37,11 +37,6 @@ #undef MachVideoSync #undef MachVideoPrepareForReactOS #undef MachGetMemoryMap -#undef MachDiskGetBootVolume -#undef MachDiskGetSystemVolume -#undef MachDiskGetBootPath -#undef MachDiskGetBootDevice -#undef MachDiskBootingFromFloppy #undef MachDiskReadLogicalSectors #undef MachDiskGetPartitionEntry #undef MachDiskGetDriveGeometry @@ -153,44 +148,6 @@ MachGetMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, ULONG MaxMemoryMapSize) return MachVtbl.GetMemoryMap(BiosMemoryMap, MaxMemoryMapSize); } -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) { diff --git a/reactos/boot/freeldr/freeldr/miscboot.c b/reactos/boot/freeldr/freeldr/miscboot.c index 3d592fd4597..3531fe254f0 100644 --- a/reactos/boot/freeldr/freeldr/miscboot.c +++ b/reactos/boot/freeldr/freeldr/miscboot.c @@ -33,9 +33,10 @@ VOID LoadAndBootBootSector(PUCHAR OperatingSystemName) { PFILE FilePointer; UCHAR SettingName[80]; - ULONG SectionId; + UCHAR SettingValue[80]; + ULONG SectionId; UCHAR FileName[260]; - ULONG BytesRead; + ULONG BytesRead; // Find all the message box settings and run them UiShowMessageBoxesInSection(OperatingSystemName); @@ -48,13 +49,27 @@ VOID LoadAndBootBootSector(PUCHAR OperatingSystemName) 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); + } + if (!IniReadSettingByName(SectionId, "BootSectorFile", FileName, 260)) { UiMessageBox("Boot sector file not specified for selected OS!"); return; } - if (!FsOpenSystemVolume(FileName, FileName, NULL)) + if (!FsOpenVolume(BootDrive, BootPartition)) { UiMessageBox("Failed to open boot drive."); return; @@ -96,12 +111,10 @@ VOID LoadAndBootBootSector(PUCHAR OperatingSystemName) VOID LoadAndBootPartition(PUCHAR OperatingSystemName) { - UCHAR SettingName[80]; - UCHAR SettingValue[80]; - ULONG SectionId; + UCHAR SettingName[80]; + UCHAR SettingValue[80]; + ULONG SectionId; PARTITION_TABLE_ENTRY PartitionTableEntry; - ULONG DriveNumber; - ULONG PartitionNumber; // Find all the message box settings and run them UiShowMessageBoxesInSection(OperatingSystemName); @@ -121,7 +134,7 @@ VOID LoadAndBootPartition(PUCHAR OperatingSystemName) return; } - DriveNumber = DriveMapGetBiosDriveNumber(SettingValue); + BootDrive = DriveMapGetBiosDriveNumber(SettingValue); // Read the boot partition if (!IniReadSettingByName(SectionId, "BootPartition", SettingValue, 80)) @@ -130,17 +143,17 @@ VOID LoadAndBootPartition(PUCHAR OperatingSystemName) return; } - PartitionNumber = atoi(SettingValue); + BootPartition = atoi(SettingValue); // Get the partition table entry - if (!DiskGetPartitionEntry(DriveNumber, PartitionNumber, &PartitionTableEntry)) + if (!DiskGetPartitionEntry(BootDrive, BootPartition, &PartitionTableEntry)) { return; } // Now try to read the partition boot sector // If this fails then abort - if (!MachDiskReadLogicalSectors(DriveNumber, PartitionTableEntry.SectorCountBeforePartition, 1, (PVOID)0x7C00)) + if (!MachDiskReadLogicalSectors(BootDrive, PartitionTableEntry.SectorCountBeforePartition, 1, (PVOID)0x7C00)) { return; } @@ -169,8 +182,7 @@ VOID LoadAndBootDrive(PUCHAR OperatingSystemName) { UCHAR SettingName[80]; UCHAR SettingValue[80]; - ULONG SectionId; - ULONG DriveNumber; + ULONG SectionId; // Find all the message box settings and run them UiShowMessageBoxesInSection(OperatingSystemName); @@ -189,11 +201,11 @@ VOID LoadAndBootDrive(PUCHAR OperatingSystemName) return; } - DriveNumber = DriveMapGetBiosDriveNumber(SettingValue); + BootDrive = DriveMapGetBiosDriveNumber(SettingValue); // Now try to read the boot sector (or mbr) // If this fails then abort - if (!MachDiskReadLogicalSectors(DriveNumber, 0, 1, (PVOID)0x7C00)) + if (!MachDiskReadLogicalSectors(BootDrive, 0, 1, (PVOID)0x7C00)) { return; } diff --git a/reactos/boot/freeldr/freeldr/reactos/arcname.c b/reactos/boot/freeldr/freeldr/reactos/arcname.c index f65ca5b26cc..9b1f1487cca 100644 --- a/reactos/boot/freeldr/freeldr/reactos/arcname.c +++ b/reactos/boot/freeldr/freeldr/reactos/arcname.c @@ -43,21 +43,7 @@ BOOL DissectArcPath(char *ArcPath, char *BootPath, ULONG* BootDrive, ULONG* Boot if (p == NULL) return FALSE; p++; - *BootPartition = 0xff; - } - else if (strnicmp(p, "cdrom(", 6) == 0) - { - /* - * cdrom path: - * multi(0)disk(0)cdrom(x)\path - */ - p = p + 6; - *BootDrive = atoi(p); - p = strchr(p, ')'); - if (p == NULL) - return FALSE; - p++; - *BootPartition = 0xff; + *BootPartition = 0; } else if (strnicmp(p, "rdisk(", 6) == 0) { diff --git a/reactos/boot/freeldr/freeldr/reactos/reactos.c b/reactos/boot/freeldr/freeldr/reactos/reactos.c index df4561271fc..9cafa6a17da 100644 --- a/reactos/boot/freeldr/freeldr/reactos/reactos.c +++ b/reactos/boot/freeldr/freeldr/reactos/reactos.c @@ -15,6 +15,16 @@ #define NDEBUG #include +#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 STDCALL FrLdrLoadKernel(PCHAR szFileName, @@ -554,7 +564,6 @@ LoadAndBootReactOS(PUCHAR OperatingSystemName) PFILE FilePointer; CHAR name[1024]; CHAR value[1024]; - CHAR SystemPath[1024]; CHAR szKernelName[1024]; CHAR szHalName[1024]; CHAR szFileName[1024]; @@ -565,6 +574,9 @@ LoadAndBootReactOS(PUCHAR OperatingSystemName) ULONG_PTR Base; ULONG Size; + + PARTITION_TABLE_ENTRY PartitionTableEntry; + ULONG rosPartition; extern ULONG PageDirectoryStart; extern ULONG PageDirectoryEnd; @@ -633,7 +645,7 @@ LoadAndBootReactOS(PUCHAR OperatingSystemName) /* * Make sure the system path is set in the .ini file */ - if (!IniReadSettingByName(SectionId, "SystemPath", SystemPath, sizeof(SystemPath))) + if (!IniReadSettingByName(SectionId, "SystemPath", value, 1024)) { UiMessageBox("System path not specified for selected operating system."); return; @@ -642,20 +654,62 @@ LoadAndBootReactOS(PUCHAR OperatingSystemName) /* * Special case for Live CD. */ - if (!stricmp(SystemPath, "LiveCD")) + if (!stricmp(value, "LiveCD")) { - /* Normalize */ - MachDiskGetBootPath(SystemPath, sizeof(SystemPath)); - strcat(SystemPath, "\\reactos"); - strcat(strcpy(multiboot_kernel_cmdline, SystemPath), - " /MININT"); + strcpy(szBootPath, "\\reactos"); + + /* Set kernel command line */ + sprintf(multiboot_kernel_cmdline, + "multi(0)disk(0)cdrom(%u)\\reactos /MININT", + (unsigned int)BootDrive); } else { - /* copy system path into kernel command line */ - strcpy(multiboot_kernel_cmdline, SystemPath); + /* + * Verify system path + */ + if (!DissectArcPath(value, szBootPath, &BootDrive, &BootPartition)) + { + sprintf(MsgBuffer,"Invalid system path: '%s'", value); + UiMessageBox(MsgBuffer); + return; + } + + /* recalculate the boot partition for freeldr */ + i = 0; + rosPartition = 0; + while (1) + { + if (!MachDiskGetPartitionEntry(BootDrive, ++i, &PartitionTableEntry)) + { + BootPartition = 0; + break; + } + if (IsRecognizedPartition(PartitionTableEntry.SystemIndicator)) + { + if (++rosPartition == BootPartition) + { + BootPartition = i; + break; + } + } + } + + if (BootPartition == 0) + { + sprintf(MsgBuffer,"Invalid system path: '%s'", value); + UiMessageBox(MsgBuffer); + return; + } + + /* copy ARC path into kernel command line */ + strcpy(multiboot_kernel_cmdline, value); } + /* Set boot drive and partition */ + ((LPSTR )(&LoaderBlock.BootDevice))[0] = (CHAR)BootDrive; + ((LPSTR )(&LoaderBlock.BootDevice))[1] = (CHAR)BootPartition; + /* * Read the optional kernel parameters (if any) */ @@ -665,6 +719,13 @@ LoadAndBootReactOS(PUCHAR OperatingSystemName) strcat(multiboot_kernel_cmdline, value); } + /* append a backslash */ + if ((strlen(szBootPath)==0) || + szBootPath[strlen(szBootPath)] != '\\') + strcat(szBootPath, "\\"); + + DbgPrint((DPRINT_REACTOS,"SystemRoot: '%s'\n", szBootPath)); + UiDrawBackdrop(); UiDrawStatusText("Detecting Hardware..."); @@ -680,21 +741,14 @@ LoadAndBootReactOS(PUCHAR OperatingSystemName) UiDrawProgressBarCenter(0, 100, "Loading ReactOS..."); /* - * Try to open system drive + * Try to open boot drive */ - if (!FsOpenSystemVolume(SystemPath, szBootPath, &LoaderBlock.BootDevice)) + if (!FsOpenVolume(BootDrive, BootPartition)) { UiMessageBox("Failed to open boot drive."); return; } - /* append a backslash */ - if ((strlen(szBootPath)==0) || - szBootPath[strlen(szBootPath)] != '\\') - strcat(szBootPath, "\\"); - - DbgPrint((DPRINT_REACTOS,"SystemRoot: '%s'\n", szBootPath)); - /* * Find the kernel image name * and try to load the kernel off the disk diff --git a/reactos/boot/freeldr/freeldr/reactos/setupldr.c b/reactos/boot/freeldr/freeldr/reactos/setupldr.c index 3571447ad37..bc2fe82e964 100644 --- a/reactos/boot/freeldr/freeldr/reactos/setupldr.c +++ b/reactos/boot/freeldr/freeldr/reactos/setupldr.c @@ -312,11 +312,13 @@ VOID RunLoader(VOID) UiDrawStatusText(""); #endif - /* set boot device */ - MachDiskGetBootDevice(&LoaderBlock.BootDevice); + /* set boot drive and partition */ + ((char *)(&LoaderBlock.BootDevice))[0] = (char)BootDrive; + ((char *)(&LoaderBlock.BootDevice))[1] = (char)BootPartition; + /* Open boot drive */ - if (!FsOpenBootVolume()) + if (!FsOpenVolume(BootDrive, BootPartition)) { #ifdef USE_UI UiMessageBox("Failed to open boot drive."); @@ -328,7 +330,7 @@ VOID RunLoader(VOID) /* Open 'txtsetup.sif' */ if (!InfOpenFile (&InfHandle, - MachDiskBootingFromFloppy() ? "\\txtsetup.sif" : "\\reactos\\txtsetup.sif", + (BootDrive < 0x80) ? "\\txtsetup.sif" : "\\reactos\\txtsetup.sif", &ErrorLine)) { printf("Failed to open 'txtsetup.sif'\n"); @@ -356,7 +358,7 @@ VOID RunLoader(VOID) printf("LoadOptions: '%s'\n", LoadOptions); #endif - if (MachDiskBootingFromFloppy()) + if (BootDrive < 0x80) { /* Boot from floppy disk */ SourcePath = "\\"; @@ -368,9 +370,12 @@ VOID RunLoader(VOID) } /* Set kernel command line */ - MachDiskGetBootPath(multiboot_kernel_cmdline, sizeof(multiboot_kernel_cmdline)); - strcat(strcat(strcat(multiboot_kernel_cmdline, SourcePath), " "), - LoadOptions); + sprintf(multiboot_kernel_cmdline, + "multi(0)disk(0)%s(%u)%s %s", + (BootDrive < 0x80) ? "fdisk" : "cdrom", + (unsigned int)BootDrive, + SourcePath, + LoadOptions); /* Load ntoskrnl.exe */ if (!LoadKernel(SourcePath, "ntoskrnl.exe")) @@ -395,7 +400,7 @@ for(;;); #endif /* Insert boot disk 2 */ - if (MachDiskBootingFromFloppy()) + if (BootDrive < 0x80) { #ifdef USE_UI UiMessageBox("Please insert \"ReactOS Boot Disk 2\" and press ENTER"); @@ -405,7 +410,7 @@ for(;;); #endif /* Open boot drive */ - if (!FsOpenBootVolume()) + if (!FsOpenVolume(BootDrive, BootPartition)) { #ifdef USE_UI UiMessageBox("Failed to open boot drive.");