Index: boot/freeldr/bootsect/isoboot.S =================================================================== --- boot/freeldr/bootsect/isoboot.S (revision 74293) +++ boot/freeldr/bootsect/isoboot.S (working copy) @@ -310,10 +310,15 @@ mov cx, HEX(FFFF) call getfssec - // Fetch our stored drive number to DL and set the boot partition to 0 in DH. - mov dl, byte ptr ds:[DriveNumber] - mov dh, 0 + // Pass two parameters to SETUPLDR: + // DL = BIOS Drive Number + // DH = Boot Partition (0 for HDD booting in hybrid mode, FFh for CD booting) + movzx dx, byte ptr ds:[DriveNumber] + cmp word ptr ds:[GetlinsecPtr], offset getlinsec_ebios + je .jump_to_setupldr + mov dh, HEX(FF) +.jump_to_setupldr: // Transfer execution to the bootloader. ljmp16 0, FREELDR_BASE Index: boot/freeldr/freeldr/arch/i386/pcdisk.c =================================================================== --- boot/freeldr/freeldr/arch/i386/pcdisk.c (revision 74293) +++ boot/freeldr/freeldr/arch/i386/pcdisk.c (working copy) @@ -575,69 +575,6 @@ } } - -static BOOLEAN -FallbackDiskIsCdRomDrive(UCHAR DriveNumber) -{ - MASTER_BOOT_RECORD MasterBootRecord; - - TRACE("FallbackDiskIsCdRomDrive(0x%x)\n", DriveNumber); - - /* CD-ROM drive numbers are always > 0x80 */ - if (DriveNumber <= 0x80) - return FALSE; - - /* - * We suppose that a CD-ROM does not have a MBR - * (not always true: example of the Hybrid USB-ISOs). - */ - return !DiskReadBootRecord(DriveNumber, 0, &MasterBootRecord); -} - -BOOLEAN DiskIsCdRomDrive(UCHAR DriveNumber) -{ - REGS RegsIn, RegsOut; - PI386_CDROM_SPEC_PACKET Packet = (PI386_CDROM_SPEC_PACKET)(BIOSCALLBUFFER); - - TRACE("DiskIsCdRomDrive(0x%x)\n", DriveNumber); - - /* CD-ROM drive numbers are always > 0x80 */ - if (DriveNumber <= 0x80) - return FALSE; - - /* Setup disk address packet */ - RtlZeroMemory(Packet, sizeof(*Packet)); - Packet->PacketSize = sizeof(*Packet); - - /* - * BIOS Int 13h, function 4B01h - Bootable CD-ROM - Get Disk Emulation Status - * AX = 4B01h - * DL = drive number - * DS:SI -> empty specification packet - * Return: - * CF clear if successful - * CF set on error - * AX = return codes - * DS:SI specification packet filled - */ - RegsIn.w.ax = 0x4B01; - RegsIn.b.dl = DriveNumber; - RegsIn.x.ds = BIOSCALLBUFSEGMENT; // DS:SI -> specification packet - RegsIn.w.si = BIOSCALLBUFOFFSET; - - Int386(0x13, &RegsIn, &RegsOut); - - // return (INT386_SUCCESS(RegsOut) && (Packet->DriveNumber == DriveNumber)); - /* - * If the simple test failed, try to use the fallback code, - * but we can be on *very* thin ice. - */ - if (!INT386_SUCCESS(RegsOut) || (Packet->DriveNumber != DriveNumber)) - return FallbackDiskIsCdRomDrive(DriveNumber); - else - return TRUE; -} - BOOLEAN PcDiskGetBootPath(OUT PCHAR BootPath, IN ULONG Size) { Index: boot/freeldr/freeldr/disk/disk.c =================================================================== --- boot/freeldr/freeldr/disk/disk.c (revision 74293) +++ boot/freeldr/freeldr/disk/disk.c (working copy) @@ -100,10 +100,6 @@ return TRUE; } - -extern BOOLEAN -DiskIsCdRomDrive(UCHAR DriveNumber); - BOOLEAN DiskGetBootPath(OUT PCHAR BootPath, IN ULONG Size) { if (*FrldrBootPath) @@ -121,9 +117,9 @@ /* This is a floppy */ sprintf(FrldrBootPath, "multi(0)disk(0)fdisk(%u)", FrldrBootDrive); } - else if (DiskIsCdRomDrive(FrldrBootDrive)) + else if (FrldrBootPartition == 0xFF) { - /* This is a CD-ROM drive */ + /* Boot Partition 0xFF is the magic value that indicates booting from CD-ROM (see isoboot.S) */ sprintf(FrldrBootPath, "multi(0)disk(0)cdrom(%u)", FrldrBootDrive - 0x80); } else