[FREELDR] Unload freeldr.ini file before booting.
[reactos.git] / boot / freeldr / freeldr / miscboot.c
index a96bbd5..4ad2daa 100644 (file)
  *  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.
+ *  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.,
+ *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
+#ifdef _M_IX86
+
+/* INCLUDES *******************************************************************/
+
 #include <freeldr.h>
 
-#ifdef __i386__
-VOID LoadAndBootBootSector(PCSTR OperatingSystemName)
+/* FUNCTIONS ******************************************************************/
+
+VOID
+LoadAndBootBootSector(IN OperatingSystemItem* OperatingSystem,
+                      IN USHORT OperatingSystemVersion)
 {
-       PFILE   FilePointer;
-       CHAR    SettingName[80];
-       ULONG   SectionId;
-       CHAR    FileName[260];
-       ULONG   BytesRead;
-
-       // Find all the message box settings and run them
-       UiShowMessageBoxesInSection(OperatingSystemName);
-
-       // Try to open the operating system section in the .ini file
-       if (!IniOpenSection(OperatingSystemName, &SectionId))
-       {
-               sprintf(SettingName, "Section [%s] not found in freeldr.ini.\n", OperatingSystemName);
-               UiMessageBox(SettingName);
-               return;
-       }
-
-       if (!IniReadSettingByName(SectionId, "BootSectorFile", FileName, sizeof(FileName)))
-       {
-               UiMessageBox("Boot sector file not specified for selected OS!");
-               return;
-       }
-
-       if (!MachDiskNormalizeSystemPath(FileName, sizeof(FileName)))
-       {
-               UiMessageBox("Invalid path to boot sector file");
-               return;
-       }
-
-       if (!FsOpenSystemVolume(FileName, FileName, NULL))
-       {
-               UiMessageBox("Failed to open boot drive.");
-               return;
-       }
-
-       FilePointer = FsOpenFile(FileName);
-       if (FilePointer == NULL)
-       {
-               strcat(FileName, " not found.");
-               UiMessageBox(FileName);
-               return;
-       }
-
-       // Read boot sector
-       if (!FsReadFile(FilePointer, 512, &BytesRead, (void*)0x7c00) || (BytesRead != 512))
-       {
-               return;
-       }
-
-       // Check for validity
-       if (*((USHORT*)(0x7c00 + 0x1fe)) != 0xaa55)
-       {
-               UiMessageBox("Invalid boot sector magic (0xaa55)");
-               return;
-       }
-
-       UiUnInitialize("Booting...");
-       // Don't stop the floppy drive motor when we
-       // are just booting a bootsector, or drive, or partition.
-       // If we were to stop the floppy motor then
-       // the BIOS wouldn't be informed and if the
-       // next read is to a floppy then the BIOS will
-       // still think the motor is on and this will
-       // result in a read error.
-       //DiskStopFloppyMotor();
-       //DisableA20();
-       ChainLoadBiosBootSectorCode();
+    ULONG_PTR SectionId;
+    PCSTR SectionName = OperatingSystem->SystemPartition;
+    CHAR  FileName[260];
+    PFILE FilePointer;
+    ULONG BytesRead;
+
+    /* Find all the message box settings and run them */
+    UiShowMessageBoxesInSection(SectionName);
+
+    /* Try to open the operating system section in the .ini file */
+    if (!IniOpenSection(SectionName, &SectionId))
+    {
+        UiMessageBox("Section [%s] not found in freeldr.ini.", SectionName);
+        return;
+    }
+
+    if (!IniReadSettingByName(SectionId, "BootSectorFile", FileName, sizeof(FileName)))
+    {
+        UiMessageBox("Boot sector file not specified for selected OS!");
+        return;
+    }
+
+    FilePointer = FsOpenFile(FileName);
+    if (!FilePointer)
+    {
+        UiMessageBox("%s not found.", FileName);
+        return;
+    }
+
+    /* Read boot sector */
+    if (!FsReadFile(FilePointer, 512, &BytesRead, (void*)0x7c00) || (BytesRead != 512))
+    {
+        UiMessageBox("Unable to read boot sector.");
+        return;
+    }
+
+    /* Check for validity */
+    if (*((USHORT*)(0x7c00 + 0x1fe)) != 0xaa55)
+    {
+        UiMessageBox("Invalid boot sector magic (0xaa55)");
+        return;
+    }
+
+    UiUnInitialize("Booting...");
+    IniCleanup();
+
+    /*
+     * Don't stop the floppy drive motor when we
+     * are just booting a bootsector, or drive, or partition.
+     * If we were to stop the floppy motor then
+     * the BIOS wouldn't be informed and if the
+     * next read is to a floppy then the BIOS will
+     * still think the motor is on and this will
+     * result in a read error.
+     */
+    // DiskStopFloppyMotor();
+    // DisableA20();
+    ChainLoadBiosBootSectorCode();
 }
 
-VOID LoadAndBootPartition(PCSTR OperatingSystemName)
+VOID
+LoadAndBootPartition(IN OperatingSystemItem* OperatingSystem,
+                     IN USHORT OperatingSystemVersion)
 {
-       CHAR                    SettingName[80];
-       CHAR                    SettingValue[80];
-       ULONG                   SectionId;
-       PARTITION_TABLE_ENTRY   PartitionTableEntry;
-       ULONG                   DriveNumber;
-       ULONG                   PartitionNumber;
-
-       // Find all the message box settings and run them
-       UiShowMessageBoxesInSection(OperatingSystemName);
-
-       // Try to open the operating system section in the .ini file
-       if (!IniOpenSection(OperatingSystemName, &SectionId))
-       {
-               sprintf(SettingName, "Section [%s] not found in freeldr.ini.\n", OperatingSystemName);
-               UiMessageBox(SettingName);
-               return;
-       }
-
-       // Read the boot drive
-       if (!IniReadSettingByName(SectionId, "BootDrive", SettingValue, sizeof(SettingValue)))
-       {
-               UiMessageBox("Boot drive not specified for selected OS!");
-               return;
-       }
-
-       DriveNumber = DriveMapGetBiosDriveNumber(SettingValue);
-
-       // Read the boot partition
-       if (!IniReadSettingByName(SectionId, "BootPartition", SettingValue, sizeof(SettingValue)))
-       {
-               UiMessageBox("Boot partition not specified for selected OS!");
-               return;
-       }
-
-       PartitionNumber = atoi(SettingValue);
-
-       // Get the partition table entry
-       if (!DiskGetPartitionEntry(DriveNumber, PartitionNumber, &PartitionTableEntry))
-       {
-               return;
-       }
-
-       // Now try to read the partition boot sector
-       // If this fails then abort
-       if (!MachDiskReadLogicalSectors(DriveNumber, PartitionTableEntry.SectorCountBeforePartition, 1, (PVOID)0x7C00))
-       {
-               return;
-       }
-
-       // Check for validity
-       if (*((USHORT*)(0x7c00 + 0x1fe)) != 0xaa55)
-       {
-               UiMessageBox("Invalid boot sector magic (0xaa55)");
-               return;
-       }
-
-       UiUnInitialize("Booting...");
-       // Don't stop the floppy drive motor when we
-       // are just booting a bootsector, or drive, or partition.
-       // If we were to stop the floppy motor then
-       // the BIOS wouldn't be informed and if the
-       // next read is to a floppy then the BIOS will
-       // still think the motor is on and this will
-       // result in a read error.
-       //DiskStopFloppyMotor();
-       //DisableA20();
-       ChainLoadBiosBootSectorCode();
+    ULONG_PTR SectionId;
+    PCSTR SectionName = OperatingSystem->SystemPartition;
+    CHAR  SettingValue[80];
+    PARTITION_TABLE_ENTRY PartitionTableEntry;
+    UCHAR DriveNumber;
+    ULONG PartitionNumber;
+
+    /* Find all the message box settings and run them */
+    UiShowMessageBoxesInSection(SectionName);
+
+    /* Try to open the operating system section in the .ini file */
+    if (!IniOpenSection(SectionName, &SectionId))
+    {
+        UiMessageBox("Section [%s] not found in freeldr.ini.", SectionName);
+        return;
+    }
+
+    /* Read the boot drive */
+    if (!IniReadSettingByName(SectionId, "BootDrive", SettingValue, sizeof(SettingValue)))
+    {
+        UiMessageBox("Boot drive not specified for selected OS!");
+        return;
+    }
+
+    DriveNumber = DriveMapGetBiosDriveNumber(SettingValue);
+
+    /* Read the boot partition */
+    if (!IniReadSettingByName(SectionId, "BootPartition", SettingValue, sizeof(SettingValue)))
+    {
+        UiMessageBox("Boot partition not specified for selected OS!");
+        return;
+    }
+
+    PartitionNumber = atoi(SettingValue);
+
+    /* Get the partition table entry */
+    if (!DiskGetPartitionEntry(DriveNumber, PartitionNumber, &PartitionTableEntry))
+    {
+        return;
+    }
+
+    /* Now try to read the partition boot sector. If this fails then abort. */
+    if (!MachDiskReadLogicalSectors(DriveNumber, PartitionTableEntry.SectorCountBeforePartition, 1, (PVOID)0x7C00))
+    {
+        UiMessageBox("Unable to read partition's boot sector.");
+        return;
+    }
+
+    /* Check for validity */
+    if (*((USHORT*)(0x7c00 + 0x1fe)) != 0xaa55)
+    {
+        UiMessageBox("Invalid boot sector magic (0xaa55)");
+        return;
+    }
+
+    UiUnInitialize("Booting...");
+    IniCleanup();
+
+    /*
+     * Don't stop the floppy drive motor when we
+     * are just booting a bootsector, or drive, or partition.
+     * If we were to stop the floppy motor then
+     * the BIOS wouldn't be informed and if the
+     * next read is to a floppy then the BIOS will
+     * still think the motor is on and this will
+     * result in a read error.
+     */
+    // DiskStopFloppyMotor();
+    // DisableA20();
+    FrldrBootDrive = DriveNumber;
+    ChainLoadBiosBootSectorCode();
 }
 
-VOID LoadAndBootDrive(PCSTR OperatingSystemName)
+VOID
+LoadAndBootDrive(IN OperatingSystemItem* OperatingSystem,
+                 IN USHORT OperatingSystemVersion)
 {
-       CHAR    SettingName[80];
-       CHAR    SettingValue[80];
-       ULONG   SectionId;
-       ULONG   DriveNumber;
-
-       // Find all the message box settings and run them
-       UiShowMessageBoxesInSection(OperatingSystemName);
-
-       // Try to open the operating system section in the .ini file
-       if (!IniOpenSection(OperatingSystemName, &SectionId))
-       {
-               sprintf(SettingName, "Section [%s] not found in freeldr.ini.\n", OperatingSystemName);
-               UiMessageBox(SettingName);
-               return;
-       }
-
-       if (!IniReadSettingByName(SectionId, "BootDrive", SettingValue, sizeof(SettingValue)))
-       {
-               UiMessageBox("Boot drive not specified for selected OS!");
-               return;
-       }
-
-       DriveNumber = DriveMapGetBiosDriveNumber(SettingValue);
-
-       // Now try to read the boot sector (or mbr)
-       // If this fails then abort
-       if (!MachDiskReadLogicalSectors(DriveNumber, 0, 1, (PVOID)0x7C00))
-       {
-               return;
-       }
-
-       // Check for validity
-       if (*((USHORT*)(0x7c00 + 0x1fe)) != 0xaa55)
-       {
-               UiMessageBox("Invalid boot sector magic (0xaa55)");
-               return;
-       }
-
-       UiUnInitialize("Booting...");
-       // Don't stop the floppy drive motor when we
-       // are just booting a bootsector, or drive, or partition.
-       // If we were to stop the floppy motor then
-       // the BIOS wouldn't be informed and if the
-       // next read is to a floppy then the BIOS will
-       // still think the motor is on and this will
-       // result in a read error.
-       //DiskStopFloppyMotor();
-       //DisableA20();
-       ChainLoadBiosBootSectorCode();
+    ULONG_PTR SectionId;
+    PCSTR SectionName = OperatingSystem->SystemPartition;
+    CHAR  SettingValue[80];
+    UCHAR DriveNumber;
+
+    /* Find all the message box settings and run them */
+    UiShowMessageBoxesInSection(SectionName);
+
+    /* Try to open the operating system section in the .ini file */
+    if (!IniOpenSection(SectionName, &SectionId))
+    {
+        UiMessageBox("Section [%s] not found in freeldr.ini.", SectionName);
+        return;
+    }
+
+    if (!IniReadSettingByName(SectionId, "BootDrive", SettingValue, sizeof(SettingValue)))
+    {
+        UiMessageBox("Boot drive not specified for selected OS!");
+        return;
+    }
+
+    DriveNumber = DriveMapGetBiosDriveNumber(SettingValue);
+
+    /* Now try to read the boot sector (or mbr). If this fails then abort. */
+    if (!MachDiskReadLogicalSectors(DriveNumber, 0, 1, (PVOID)0x7C00))
+    {
+        UiMessageBox("Unable to read boot sector");
+        return;
+    }
+
+    /* Check for validity */
+    if (*((USHORT*)(0x7c00 + 0x1fe)) != 0xaa55)
+    {
+        UiMessageBox("Invalid boot sector magic (0xaa55)");
+        return;
+    }
+
+    UiUnInitialize("Booting...");
+    IniCleanup();
+
+    /*
+     * Don't stop the floppy drive motor when we
+     * are just booting a bootsector, or drive, or partition.
+     * If we were to stop the floppy motor then
+     * the BIOS wouldn't be informed and if the
+     * next read is to a floppy then the BIOS will
+     * still think the motor is on and this will
+     * result in a read error.
+     */
+    // DiskStopFloppyMotor();
+    // DisableA20();
+    FrldrBootDrive = DriveNumber;
+    ChainLoadBiosBootSectorCode();
 }
-#endif /* __i386__ */
+
+#endif // _M_IX86