[syslinux:master] chain: Support loading ReactOS' FreeLdr

syslinux-bot for Shao Miller shao.miller at yrdsb.edu.on.ca
Sun May 1 16:06:40 PDT 2011


Commit-ID:  ad4cf1470977f648ee1dd45e97939589ccb0393c
Gitweb:     http://syslinux.zytor.com/commit/ad4cf1470977f648ee1dd45e97939589ccb0393c
Author:     Shao Miller <shao.miller at yrdsb.edu.on.ca>
AuthorDate: Sun, 1 May 2011 13:49:43 -0400
Committer:  Shao Miller <shao.miller at yrdsb.edu.on.ca>
CommitDate: Sun, 1 May 2011 14:14:24 -0400

chain: Support loading ReactOS' FreeLdr

Use something like:

  LABEL freeldr
    COM32 chain.c32
    APPEND freeldr=freeldr.sys

Signed-off-by: Shao Miller <shao.miller at yrdsb.edu.on.ca>


---
 NEWS                  |    1 +
 com32/modules/chain.c |   17 +++++++++++++++++
 2 files changed, 18 insertions(+), 0 deletions(-)

diff --git a/NEWS b/NEWS
index 443e1a5..88adba1 100644
--- a/NEWS
+++ b/NEWS
@@ -8,6 +8,7 @@ Changes in 4.05:
 	* ISOLINUX: remove the .img file support; it has been broken
 	  on virtually all systems since the beginning, and has been
 	  totally broken since 4.00 at least.  Use MEMDISK instead.
+	* chain.c32: Support chaining ReactOS' FreeLdr (Shao Miller)
 
 Changes in 4.04:
 	* PXELINUX: Fix handling of unqualified DNS names.
diff --git a/com32/modules/chain.c b/com32/modules/chain.c
index b4ee626..0e289f6 100644
--- a/com32/modules/chain.c
+++ b/com32/modules/chain.c
@@ -107,6 +107,9 @@
  *
  * keeppxe
  *	keep the PXE and UNDI stacks in memory (PXELINUX only).
+ *
+ * freeldr=<loader>
+ *  loads ReactOS' FreeLdr.sys to 0:8000 and jumps to the PE entry-point
  */
 
 #include <com32.h>
@@ -132,6 +135,7 @@ static struct options {
     bool isolinux;
     bool cmldr;
     bool grub;
+    bool freeldr;
     bool grldr;
     const char *grubcfg;
     bool swap;
@@ -1278,6 +1282,7 @@ Options: file=<loader>      Load and execute file, instead of boot sector\n\
          ntldr=<loader>     Load Windows NTLDR, SETUPLDR.BIN or BOOTMGR\n\
          cmldr=<loader>     Load Recovery Console of Windows NT/2K/XP/2003\n\
          freedos=<loader>   Load FreeDOS KERNEL.SYS\n\
+         freeldr=<loader>   Load ReactOS' FREELDR.SYS\n\
          msdos=<loader>     Load MS-DOS IO.SYS\n\
          pcdos=<loader>     Load PC-DOS IBMBIO.COM\n\
          drmk=<loader>      Load DRMK DELLBIO.BIN\n\
@@ -1346,6 +1351,11 @@ int main(int argc, char *argv[])
 	    opt.seg = 0x60;	/* FREEDOS wants this address */
 	    opt.loadfile = argv[i] + 8;
 	    opt.sethidden = true;
+	} else if (!strncmp(argv[i], "freeldr=", 8)) {
+	    opt.loadfile = argv[i] + 8;
+	    opt.sethidden = true;
+	    /* The FreeLdr PE wants to be at 0:8000 */
+	    opt.freeldr = true;
 	} else if (!strncmp(argv[i], "msdos=", 6) ||
 		   !strncmp(argv[i], "pcdos=", 6)) {
 	    opt.seg = 0x70;	/* MS-DOS 2.0+ wants this address */
@@ -1418,6 +1428,13 @@ int main(int argc, char *argv[])
 	regs.ip = regs.esp.l = 0x7c00;
     }
 
+    if (opt.freeldr) {
+	/* Load to 0800:0000, which happens to be 0000:8000 */
+	opt.seg = 0x800;
+	/* TODO: Properly parse the PE.  Right now, this is hard-coded */
+	regs.ip = 0x8100;
+    }
+
     hd = 0;
     if (!strncmp(drivename, "mbr", 3)) {
 	drive = find_disk(strtoul(drivename + 4, NULL, 0));



More information about the Syslinux-commits mailing list