Revert freeldr back to revision 14697
authorGé van Geldorp <ge@gse.nl>
Sat, 23 Apr 2005 10:15:49 +0000 (10:15 +0000)
committerGé van Geldorp <ge@gse.nl>
Sat, 23 Apr 2005 10:15:49 +0000 (10:15 +0000)
svn path=/trunk/; revision=14765

27 files changed:
reactos/boot/freeldr/freeldr/arch/i386/arch.S
reactos/boot/freeldr/freeldr/arch/i386/archmach.c
reactos/boot/freeldr/freeldr/arch/i386/boot.S
reactos/boot/freeldr/freeldr/arch/i386/i386.h [deleted file]
reactos/boot/freeldr/freeldr/arch/i386/i386disk.c
reactos/boot/freeldr/freeldr/arch/i386/linux.S
reactos/boot/freeldr/freeldr/arch/i386/machpc.c
reactos/boot/freeldr/freeldr/arch/i386/machpc.h
reactos/boot/freeldr/freeldr/arch/i386/machxbox.c
reactos/boot/freeldr/freeldr/arch/i386/machxbox.h
reactos/boot/freeldr/freeldr/arch/powerpc/mach.c
reactos/boot/freeldr/freeldr/bootmgr.c
reactos/boot/freeldr/freeldr/disk/partition.c
reactos/boot/freeldr/freeldr/freeldr.c
reactos/boot/freeldr/freeldr/fs/fs.c
reactos/boot/freeldr/freeldr/fs/fsrec.h [moved from reactos/boot/freeldr/freeldr/include/fsrec.h with 100% similarity]
reactos/boot/freeldr/freeldr/include/freeldr.h
reactos/boot/freeldr/freeldr/include/fs.h
reactos/boot/freeldr/freeldr/include/machine.h
reactos/boot/freeldr/freeldr/inifile/ini.h
reactos/boot/freeldr/freeldr/inifile/ini_init.c
reactos/boot/freeldr/freeldr/linuxboot.c
reactos/boot/freeldr/freeldr/machine.c
reactos/boot/freeldr/freeldr/miscboot.c
reactos/boot/freeldr/freeldr/reactos/arcname.c
reactos/boot/freeldr/freeldr/reactos/reactos.c
reactos/boot/freeldr/freeldr/reactos/setupldr.c

index 5780cea..bc334ef 100644 (file)
@@ -47,10 +47,10 @@ EXTERN(RealEntryPoint)
        .code32
 
        /* Store the boot drive */
        .code32
 
        /* Store the boot drive */
-       movb    %dl,(_i386BootDrive)
+       movb    %dl,(_BootDrive)
 
        /* Store the boot partition */
 
        /* Store the boot partition */
-       movb    %dh,(_i386BootPartition)
+       movb    %dh,(_BootPartition)
 
        /* GO! */
        xorl    %eax,%eax
 
        /* GO! */
        xorl    %eax,%eax
@@ -275,11 +275,9 @@ EXTERN(_DisableA20)
  * other boot loaders like Grub
  */
 
  * 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 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
 
 /*
  * 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
  */
  * 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
 
 #define FREELDR_BASE 0x8000
 #define INITIAL_BASE 0x200000
 
@@ -329,31 +328,6 @@ mb1:
        movw    %dx,%ds
        movw    %dx,%es
 
        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
        /* 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 */
 
        /* 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
        /* Reload segment selectors */
        movw    $PMODE_DS,%dx
        movw    %dx,%ds
@@ -379,28 +353,39 @@ mb4:
        movw    %dx,%ss
        movl    $STACK32ADDR,%esp
 
        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
        /* 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
        /* 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
        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    
 
        /* GO! */
        pushl   %eax    
@@ -477,15 +462,8 @@ rmode_idtptr:
        .word   0x3ff           /* Limit */
        .long   0                       /* Base Address */
 
        .word   0x3ff           /* Limit */
        .long   0                       /* Base Address */
 
-EXTERN(_i386BootDrive)
+EXTERN(_BootDrive)
        .long   0
 
        .long   0
 
-EXTERN(_i386BootPartition)
+EXTERN(_BootPartition)
        .long   0
        .long   0
-
-.bss
-mb_info:
-       .fill   MB_INFO_SIZE, 1, 0
-
-cmdline:
-       .fill   CMDLINE_SIZE, 1, 0
index c8171b0..347d8f5 100644 (file)
@@ -27,7 +27,7 @@
 #include "rtl.h"
 
 VOID
 #include "rtl.h"
 
 VOID
-MachInit(char *CmdLine)
+MachInit(VOID)
 {
   ULONG PciId;
 
 {
   ULONG PciId;
 
@@ -39,11 +39,11 @@ MachInit(char *CmdLine)
   PciId = READ_PORT_ULONG((ULONG*) 0xcfc);
   if (0x02a510de == PciId)
     {
   PciId = READ_PORT_ULONG((ULONG*) 0xcfc);
   if (0x02a510de == PciId)
     {
-      XboxMachInit(CmdLine);
+      XboxMachInit();
     }
   else
     {
     }
   else
     {
-      PcMachInit(CmdLine);
+      PcMachInit();
     }
 
   HalpCalibrateStallExecution();
     }
 
   HalpCalibrateStallExecution();
index 3fb9bbb..ef46585 100644 (file)
@@ -31,7 +31,7 @@ EXTERN(_ChainLoadBiosBootSectorCode)
        .code16
 
        /* Set the boot drive */
        .code16
 
        /* Set the boot drive */
-       movb    (_i386BootDrive),%dl
+       movb    (_BootDrive),%dl
 
        /* Load segment registers */
        cli
 
        /* 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 (file)
index cb76eda..0000000
+++ /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 */
index b7b3a50..cc0bdb3 100644 (file)
@@ -19,8 +19,6 @@
 
 #include "freeldr.h"
 #include "debug.h"
 
 #include "freeldr.h"
 #include "debug.h"
-#include "i386.h"
-#include "fsrec.h"
 
 /////////////////////////////////////////////////////////////////////////////////////////////
 // FUNCTIONS
 
 /////////////////////////////////////////////////////////////////////////////////////////////
 // FUNCTIONS
@@ -168,244 +166,4 @@ BOOL DiskGetExtendedDriveParameters(ULONG DriveNumber, PVOID Buffer, USHORT Buff
        return TRUE;
 }
 
        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__
index 43c1c20..16a5a00 100644 (file)
@@ -30,7 +30,7 @@ EXTERN(_BootNewLinuxKernel)
        .code16
 
        /* Set the boot drive */
        .code16
 
        /* Set the boot drive */
-       movb    (_i386BootDrive),%dl
+       movb    (_BootDrive),%dl
 
        /* Load segment registers */
        cli
 
        /* Load segment registers */
        cli
@@ -66,7 +66,7 @@ EXTERN(_BootOldLinuxKernel)
        .code16
 
        /* Set the boot drive */
        .code16
 
        /* Set the boot drive */
-       movb    (_i386BootDrive),%dl
+       movb    (_BootDrive),%dl
 
        /* Load segment registers */
        cli
 
        /* Load segment registers */
        cli
index 8bbe0ca..0a6fa28 100644 (file)
 #include "machine.h"
 #include "machpc.h"
 #include "rtl.h"
 #include "machine.h"
 #include "machpc.h"
 #include "rtl.h"
-#include "i386.h"
 
 VOID
 
 VOID
-PcMachInit(char *CmdLine)
+PcMachInit(VOID)
 {
   EnableA20();
 
 {
   EnableA20();
 
@@ -49,11 +48,6 @@ PcMachInit(char *CmdLine)
   MachVtbl.VideoSync = PcVideoSync;
   MachVtbl.VideoPrepareForReactOS = PcVideoPrepareForReactOS;
   MachVtbl.GetMemoryMap = PcMemGetMemoryMap;
   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;
   MachVtbl.DiskReadLogicalSectors = PcDiskReadLogicalSectors;
   MachVtbl.DiskGetPartitionEntry = PcDiskGetPartitionEntry;
   MachVtbl.DiskGetDriveGeometry = PcDiskGetDriveGeometry;
index 7a2a6eb..5462a10 100644 (file)
@@ -26,7 +26,7 @@
 #include "mm.h"
 #endif
 
 #include "mm.h"
 #endif
 
-VOID PcMachInit(char *CmdLine);
+VOID PcMachInit(VOID);
 
 VOID PcConsPutChar(int Ch);
 BOOL PcConsKbHit();
 
 VOID PcConsPutChar(int Ch);
 BOOL PcConsKbHit();
index bbb3ca8..dd44d36 100644 (file)
 #include "mm.h"
 #include "machine.h"
 #include "machxbox.h"
 #include "mm.h"
 #include "machine.h"
 #include "machxbox.h"
-#include "i386.h"
 
 VOID
 
 VOID
-XboxMachInit(char *CmdLine)
+XboxMachInit(VOID)
 {
   /* Initialize our stuff */
   XboxMemInit();
 {
   /* Initialize our stuff */
   XboxMemInit();
@@ -47,11 +46,6 @@ XboxMachInit(char *CmdLine)
   MachVtbl.VideoSync = XboxVideoSync;
   MachVtbl.VideoPrepareForReactOS = XboxVideoPrepareForReactOS;
   MachVtbl.GetMemoryMap = XboxMemGetMemoryMap;
   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;
   MachVtbl.DiskReadLogicalSectors = XboxDiskReadLogicalSectors;
   MachVtbl.DiskGetPartitionEntry = XboxDiskGetPartitionEntry;
   MachVtbl.DiskGetDriveGeometry = XboxDiskGetDriveGeometry;
index d82cdc8..845f242 100644 (file)
@@ -26,7 +26,7 @@
 
 UCHAR XboxFont8x16[256 * 16];
 
 
 UCHAR XboxFont8x16[256 * 16];
 
-VOID XboxMachInit(char *CmdLine);
+VOID XboxMachInit(VOID);
 
 VOID XboxConsPutChar(int Ch);
 BOOL XboxConsKbHit();
 
 VOID XboxConsPutChar(int Ch);
 BOOL XboxConsKbHit();
index 071ec9e..b5405cc 100644 (file)
@@ -279,7 +279,7 @@ void PpcInit( of_proxy the_ofproxy ) {
     BootMain("freeldr-ppc");    
 }
 
     BootMain("freeldr-ppc");    
 }
 
-void MachInit(char *CmdLine) {
+void MachInit() {
     int len;
     printf( "Determining boot device:\n" );
     len = ofw_getprop(chosen_package, "bootpath", 
     int len;
     printf( "Determining boot device:\n" );
     len = ofw_getprop(chosen_package, "bootpath", 
index fa7f3a4..01cd521 100644 (file)
@@ -49,13 +49,6 @@ VOID RunLoader(VOID)
        LONG            TimeOut;
        ULONG           SelectedOperatingSystem;
 
        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");
        if (!IniFileInitialize())
        {
                printf("Press any key to reboot.\n");
index 42d1f0a..4c1aa01 100644 (file)
@@ -28,8 +28,7 @@
 
 BOOL DiskGetActivePartitionEntry(ULONG DriveNumber, PPARTITION_TABLE_ENTRY PartitionTableEntry)
 {
 
 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
        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++;
        if (MasterBootRecord.PartitionTable[0].BootIndicator == 0x80)
        {
                BootablePartitionCount++;
-               ActivePartition = 0;
+               BootPartition = 0;
        }
        if (MasterBootRecord.PartitionTable[1].BootIndicator == 0x80)
        {
                BootablePartitionCount++;
        }
        if (MasterBootRecord.PartitionTable[1].BootIndicator == 0x80)
        {
                BootablePartitionCount++;
-               ActivePartition = 1;
+               BootPartition = 1;
        }
        if (MasterBootRecord.PartitionTable[2].BootIndicator == 0x80)
        {
                BootablePartitionCount++;
        }
        if (MasterBootRecord.PartitionTable[2].BootIndicator == 0x80)
        {
                BootablePartitionCount++;
-               ActivePartition = 2;
+               BootPartition = 2;
        }
        if (MasterBootRecord.PartitionTable[3].BootIndicator == 0x80)
        {
                BootablePartitionCount++;
        }
        if (MasterBootRecord.PartitionTable[3].BootIndicator == 0x80)
        {
                BootablePartitionCount++;
-               ActivePartition = 3;
+               BootPartition = 3;
        }
 
        // Make sure there was only one bootable partition
        }
 
        // 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
        }
 
        // 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;
 }
 
        return TRUE;
 }
index 0a2259a..d1a6b56 100644 (file)
@@ -31,7 +31,7 @@ VOID BootMain(char *CmdLine)
 {
        CmdLineParse(CmdLine);
 
 {
        CmdLineParse(CmdLine);
 
-       MachInit(CmdLine);
+       MachInit();
 
        DebugInit();
 
 
        DebugInit();
 
index 7bb4488..c91813f 100644 (file)
@@ -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.
  *
  * 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);
                return IsoOpenVolume(DriveNumber);
-       default:
-               FsType = 0;
-               sprintf(ErrorText, "Unsupported file system. Type: 0x%x", Type);
-               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;
+       // 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;
+               }
+       }
 
 
-       if (! MachDiskGetBootVolume(&DriveNumber, &StartSector, &SectorCount, &Type))
+       // Check for valid partition
+       if (PartitionTableEntry.SystemIndicator == PARTITION_ENTRY_UNUSED)
        {
        {
-               FileSystemError("Unable to locate boot partition\n");
+               FileSystemError("Invalid partition.");
                return FALSE;
        }
 
                return FALSE;
        }
 
-       return FsOpenVolume(DriveNumber, StartSector, SectorCount, Type);
-}
+       // Try to recognize the file system
+       if (!FsRecognizeVolume(DriveNumber, PartitionTableEntry.SectorCountBeforePartition, &VolumeType))
+       {
+               FileSystemError("Unrecognized file system.");
+               return FALSE;
+       }
 
 
-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))
+       //switch (PartitionTableEntry.SystemIndicator)
+       switch (VolumeType)
        {
        {
-               FileSystemError("Unable to locate system partition\n");
+       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);
                return FALSE;
        }
 
                return FALSE;
        }
 
-       return FsOpenVolume(DriveNumber, StartSector, SectorCount, Type);
+       return TRUE;
 }
 
 }
 
-
 PFILE FsOpenFile(PUCHAR FileName)
 {
        PFILE   FileHandle = NULL;
 PFILE FsOpenFile(PUCHAR FileName)
 {
        PFILE   FileHandle = NULL;
index c9082ae..3b41ac3 100644 (file)
@@ -38,6 +38,8 @@
 #define ROUND_DOWN(N, S) ((N) & ~((S) - 1))
 #define Ke386EraseFlags(x)     __asm__ __volatile__("pushl $0 ; popfl\n")
                                            
 #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);
 extern BOOL UserInterfaceUp;   /* Tells us if the user interface is displayed */
 
 VOID BootMain(LPSTR CmdLine);
index 2af910e..6b2d57d 100644 (file)
@@ -33,8 +33,7 @@
 #define PFILE                  FILE *
 
 VOID   FileSystemError(PUCHAR ErrorString);
 #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);
 PFILE  FsOpenFile(PUCHAR FileName);
 VOID   FsCloseFile(PFILE FileHandle);
 BOOL   FsReadFile(PFILE FileHandle, ULONG BytesToRead, ULONG* BytesRead, PVOID Buffer);
index 5879d2e..2642ed5 100644 (file)
@@ -56,11 +56,6 @@ typedef struct tagMACHVTBL
 
   ULONG (*GetMemoryMap)(PBIOS_MEMORY_MAP BiosMemoryMap, ULONG MaxMemoryMapSize);
 
 
   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);
   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 (*HwDetect)(VOID);
 } MACHVTBL, *PMACHVTBL;
 
-VOID MachInit(char *CmdLine);
+VOID MachInit(VOID);
 
 extern MACHVTBL MachVtbl;
 
 
 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 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))
 #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))
index 64bd038..98a7496 100644 (file)
@@ -57,7 +57,7 @@ extern        PINI_SECTION            IniFileSectionListHead;
 extern ULONG                                   IniFileSectionCount;
 extern ULONG                                   IniFileSettingCount;
 
 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);
 
 BOOL   IniParseFile(PUCHAR IniFileData, ULONG IniFileSize);
 ULONG          IniGetNextLineSize(PUCHAR IniFileData, ULONG IniFileSize, ULONG CurrentOffset);
index b145c11..046133e 100644 (file)
@@ -33,7 +33,22 @@ BOOL IniFileInitialize(VOID)
        BOOL    Success;
 
        // Open freeldr.ini
        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)
        {
 
        if (Freeldr_Ini == NULL)
        {
@@ -72,10 +87,24 @@ BOOL IniFileInitialize(VOID)
        return Success;
 }
 
        return Success;
 }
 
-PFILE IniOpenIniFile()
+PFILE IniOpenIniFile(UCHAR BootDriveNumber, UCHAR BootPartitionNumber)
 {
        PFILE   IniFileHandle;  // File handle for freeldr.ini
 
 {
        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");
 
        // Try to open freeldr.ini
        IniFileHandle = FsOpenFile("freeldr.ini");
 
index 255c9ea..fa1df78 100644 (file)
 
 PLINUX_BOOTSECTOR      LinuxBootSector = NULL;
 PLINUX_SETUPSECTOR     LinuxSetupSector = NULL;
 
 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)
 {
 
 VOID LoadAndBootLinux(PUCHAR OperatingSystemName, PUCHAR Description)
 {
@@ -81,7 +80,7 @@ VOID LoadAndBootLinux(PUCHAR OperatingSystemName, PUCHAR Description)
        }
 
        // Open the boot volume
        }
 
        // Open the boot volume
-       if (!FsOpenSystemVolume(LinuxBootPath, NULL, NULL))
+       if (!FsOpenVolume(BootDrive, BootPartition))
        {
                UiMessageBox("Failed to open boot drive.");
                goto LinuxBootFailed;
        {
                UiMessageBox("Failed to open boot drive.");
                goto LinuxBootFailed;
@@ -227,7 +226,8 @@ LinuxBootFailed:
 BOOL LinuxParseIniSection(PUCHAR OperatingSystemName)
 {
        UCHAR   SettingName[260];
 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);
 
        // Find all the message box settings and run them
        UiShowMessageBoxesInSection(OperatingSystemName);
@@ -240,12 +240,20 @@ BOOL LinuxParseIniSection(PUCHAR OperatingSystemName)
                return FALSE;
        }
 
                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;
        }
 
                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))
        {
        // Get the kernel name
        if (!IniReadSettingByName(SectionId, "Kernel", LinuxKernelName, 260))
        {
index 99146d6..520769e 100644 (file)
 #undef MachVideoSync
 #undef MachVideoPrepareForReactOS
 #undef MachGetMemoryMap
 #undef MachVideoSync
 #undef MachVideoPrepareForReactOS
 #undef MachGetMemoryMap
-#undef MachDiskGetBootVolume
-#undef MachDiskGetSystemVolume
-#undef MachDiskGetBootPath
-#undef MachDiskGetBootDevice
-#undef MachDiskBootingFromFloppy
 #undef MachDiskReadLogicalSectors
 #undef MachDiskGetPartitionEntry
 #undef MachDiskGetDriveGeometry
 #undef MachDiskReadLogicalSectors
 #undef MachDiskGetPartitionEntry
 #undef MachDiskGetDriveGeometry
@@ -153,44 +148,6 @@ MachGetMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, ULONG MaxMemoryMapSize)
   return MachVtbl.GetMemoryMap(BiosMemoryMap, 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)
 {
 BOOL
 MachDiskReadLogicalSectors(ULONG DriveNumber, ULONGLONG SectorNumber, ULONG SectorCount, PVOID Buffer)
 {
index 3d592fd..3531fe2 100644 (file)
@@ -33,9 +33,10 @@ VOID LoadAndBootBootSector(PUCHAR OperatingSystemName)
 {
        PFILE   FilePointer;
        UCHAR   SettingName[80];
 {
        PFILE   FilePointer;
        UCHAR   SettingName[80];
-       ULONG   SectionId;
+       UCHAR   SettingValue[80];
+       ULONG           SectionId;
        UCHAR   FileName[260];
        UCHAR   FileName[260];
-       ULONG   BytesRead;
+       ULONG           BytesRead;
 
        // Find all the message box settings and run them
        UiShowMessageBoxesInSection(OperatingSystemName);
 
        // Find all the message box settings and run them
        UiShowMessageBoxesInSection(OperatingSystemName);
@@ -48,13 +49,27 @@ VOID LoadAndBootBootSector(PUCHAR OperatingSystemName)
                return;
        }
 
                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 (!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;
        {
                UiMessageBox("Failed to open boot drive.");
                return;
@@ -96,12 +111,10 @@ VOID LoadAndBootBootSector(PUCHAR OperatingSystemName)
 
 VOID LoadAndBootPartition(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;
        PARTITION_TABLE_ENTRY   PartitionTableEntry;
-       ULONG                   DriveNumber;
-       ULONG                   PartitionNumber;
 
        // Find all the message box settings and run them
        UiShowMessageBoxesInSection(OperatingSystemName);
 
        // Find all the message box settings and run them
        UiShowMessageBoxesInSection(OperatingSystemName);
@@ -121,7 +134,7 @@ VOID LoadAndBootPartition(PUCHAR OperatingSystemName)
                return;
        }
 
                return;
        }
 
-       DriveNumber = DriveMapGetBiosDriveNumber(SettingValue);
+       BootDrive = DriveMapGetBiosDriveNumber(SettingValue);
 
        // Read the boot partition
        if (!IniReadSettingByName(SectionId, "BootPartition", SettingValue, 80))
 
        // Read the boot partition
        if (!IniReadSettingByName(SectionId, "BootPartition", SettingValue, 80))
@@ -130,17 +143,17 @@ VOID LoadAndBootPartition(PUCHAR OperatingSystemName)
                return;
        }
 
                return;
        }
 
-       PartitionNumber = atoi(SettingValue);
+       BootPartition = atoi(SettingValue);
 
        // Get the partition table entry
 
        // 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
        {
                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;
        }
        {
                return;
        }
@@ -169,8 +182,7 @@ VOID LoadAndBootDrive(PUCHAR OperatingSystemName)
 {
        UCHAR   SettingName[80];
        UCHAR   SettingValue[80];
 {
        UCHAR   SettingName[80];
        UCHAR   SettingValue[80];
-       ULONG   SectionId;
-       ULONG   DriveNumber;
+       ULONG           SectionId;
 
        // Find all the message box settings and run them
        UiShowMessageBoxesInSection(OperatingSystemName);
 
        // Find all the message box settings and run them
        UiShowMessageBoxesInSection(OperatingSystemName);
@@ -189,11 +201,11 @@ VOID LoadAndBootDrive(PUCHAR OperatingSystemName)
                return;
        }
 
                return;
        }
 
-       DriveNumber = DriveMapGetBiosDriveNumber(SettingValue);
+       BootDrive = DriveMapGetBiosDriveNumber(SettingValue);
 
        // Now try to read the boot sector (or mbr)
        // If this fails then abort
 
        // 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;
        }
        {
                return;
        }
index f65ca5b..9b1f148 100644 (file)
@@ -43,21 +43,7 @@ BOOL DissectArcPath(char *ArcPath, char *BootPath, ULONG* BootDrive, ULONG* Boot
                if (p == NULL)
                        return FALSE;
                p++;
                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)
        {
        }
        else if (strnicmp(p, "rdisk(", 6) == 0)
        {
index df45612..9cafa6a 100644 (file)
 #define NDEBUG
 #include <debug.h>
 
 #define NDEBUG
 #include <debug.h>
 
+#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,
 BOOL
 STDCALL
 FrLdrLoadKernel(PCHAR szFileName,
@@ -554,7 +564,6 @@ LoadAndBootReactOS(PUCHAR OperatingSystemName)
        PFILE FilePointer;
        CHAR  name[1024];
        CHAR  value[1024];
        PFILE FilePointer;
        CHAR  name[1024];
        CHAR  value[1024];
-       CHAR  SystemPath[1024];
        CHAR  szKernelName[1024];
        CHAR  szHalName[1024];
        CHAR  szFileName[1024];
        CHAR  szKernelName[1024];
        CHAR  szHalName[1024];
        CHAR  szFileName[1024];
@@ -565,6 +574,9 @@ LoadAndBootReactOS(PUCHAR OperatingSystemName)
 
        ULONG_PTR Base;
        ULONG Size;
 
        ULONG_PTR Base;
        ULONG Size;
+
+       PARTITION_TABLE_ENTRY PartitionTableEntry;
+       ULONG rosPartition;
  
        extern ULONG PageDirectoryStart;
        extern ULONG PageDirectoryEnd;
  
        extern ULONG PageDirectoryStart;
        extern ULONG PageDirectoryEnd;
@@ -633,7 +645,7 @@ LoadAndBootReactOS(PUCHAR OperatingSystemName)
        /*
         * Make sure the system path is set in the .ini file
         */
        /*
         * 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;
        {
                UiMessageBox("System path not specified for selected operating system.");
                return;
@@ -642,20 +654,62 @@ LoadAndBootReactOS(PUCHAR OperatingSystemName)
        /*
         * Special case for Live CD.
         */
        /*
         * 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
        {
        }
        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)
         */
        /*
         * Read the optional kernel parameters (if any)
         */
@@ -665,6 +719,13 @@ LoadAndBootReactOS(PUCHAR OperatingSystemName)
                strcat(multiboot_kernel_cmdline, value);
        }
 
                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...");
 
        UiDrawBackdrop();
        UiDrawStatusText("Detecting Hardware...");
@@ -680,21 +741,14 @@ LoadAndBootReactOS(PUCHAR OperatingSystemName)
        UiDrawProgressBarCenter(0, 100, "Loading ReactOS...");
 
        /*
        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;
        }
 
        {
                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
        /*
         * Find the kernel image name
         * and try to load the kernel off the disk
index 3571447..bc2fe82 100644 (file)
@@ -312,11 +312,13 @@ VOID RunLoader(VOID)
   UiDrawStatusText("");
 #endif
 
   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 */
 
   /* Open boot drive */
-  if (!FsOpenBootVolume())
+  if (!FsOpenVolume(BootDrive, BootPartition))
     {
 #ifdef USE_UI
       UiMessageBox("Failed to open boot drive.");
     {
 #ifdef USE_UI
       UiMessageBox("Failed to open boot drive.");
@@ -328,7 +330,7 @@ VOID RunLoader(VOID)
 
   /* Open 'txtsetup.sif' */
   if (!InfOpenFile (&InfHandle,
 
   /* 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");
                    &ErrorLine))
     {
       printf("Failed to open 'txtsetup.sif'\n");
@@ -356,7 +358,7 @@ VOID RunLoader(VOID)
   printf("LoadOptions: '%s'\n", LoadOptions);
 #endif
 
   printf("LoadOptions: '%s'\n", LoadOptions);
 #endif
 
-  if (MachDiskBootingFromFloppy())
+  if (BootDrive < 0x80)
     {
       /* Boot from floppy disk */
       SourcePath = "\\";
     {
       /* Boot from floppy disk */
       SourcePath = "\\";
@@ -368,9 +370,12 @@ VOID RunLoader(VOID)
     }
 
   /* Set kernel command line */
     }
 
   /* 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"))
 
   /* Load ntoskrnl.exe */
   if (!LoadKernel(SourcePath, "ntoskrnl.exe"))
@@ -395,7 +400,7 @@ for(;;);
 #endif
 
   /* Insert boot disk 2 */
 #endif
 
   /* Insert boot disk 2 */
-  if (MachDiskBootingFromFloppy())
+  if (BootDrive < 0x80)
     {
 #ifdef USE_UI
       UiMessageBox("Please insert \"ReactOS Boot Disk 2\" and press ENTER");
     {
 #ifdef USE_UI
       UiMessageBox("Please insert \"ReactOS Boot Disk 2\" and press ENTER");
@@ -405,7 +410,7 @@ for(;;);
 #endif
 
       /* Open boot drive */
 #endif
 
       /* Open boot drive */
-      if (!FsOpenBootVolume())
+      if (!FsOpenVolume(BootDrive, BootPartition))
        {
 #ifdef USE_UI
          UiMessageBox("Failed to open boot drive.");
        {
 #ifdef USE_UI
          UiMessageBox("Failed to open boot drive.");