aboutsummaryrefslogtreecommitdiffstats
path: root/com32
diff options
context:
space:
mode:
authorKim Mik <kimmik999999@yahoo.co.uk>2009-12-28 21:42:55 +0000
committerH. Peter Anvin <hpa@zytor.com>2009-12-28 16:19:10 -0800
commit72755af2664dcea9d699fa6b8e0af72867bb5d72 (patch)
tree3ba1fb452a1aac8cac1dadd92698fd55cbc3d01d /com32
parentf491a01cbac0ecc7eb072d2caeac2d529091eb9b (diff)
downloadsyslinux.git-72755af2664dcea9d699fa6b8e0af72867bb5d72.tar.gz
syslinux.git-72755af2664dcea9d699fa6b8e0af72867bb5d72.tar.xz
syslinux.git-72755af2664dcea9d699fa6b8e0af72867bb5d72.zip
chain.c32: add support for booting the Recovery Console of Windows NT/2K/XP
The following patch for chain.c32 adds support to boot the Recovery Console of Windows NT/2K/XP. Normally when you want to boot the recovery console, you need to patch "cmdcons\0" into the bootsectorof the partition (8 bytes starting at 0x3 (4th byte)). We can do this patching in memory: strcpy((char *) 0x7c03, "cmdcons"); To boot the recovery console with chain.c32: chain.c32 cmldr=/cmldr - Gert Hulselmans
Diffstat (limited to 'com32')
-rw-r--r--com32/modules/chain.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/com32/modules/chain.c b/com32/modules/chain.c
index be09748b..1ae20d4a 100644
--- a/com32/modules/chain.c
+++ b/com32/modules/chain.c
@@ -48,6 +48,10 @@
* ntldr=<loader>:
* equivalent to -seg 0x2000 -file <loader>, used with WinNT's loaders
*
+ * cmldr=<loader>:
+ * used with Recovery Console of Windows NT/2K/XP.
+ * same as ntldr=<loader> & "cmdcons\0" written to memory address 0000:7C03
+ *
* freedos=<loader>:
* equivalent to -seg 0x60 -file <loader>, used with FreeDOS kernel.sys.
*
@@ -85,6 +89,7 @@ static struct options {
uint16_t keeppxe;
uint16_t seg;
bool isolinux;
+ bool cmldr;
bool swap;
bool hide;
} opt;
@@ -679,6 +684,10 @@ int main(int argc, char *argv[])
} else if (!strncmp(argv[i], "ntldr=", 6)) {
opt.seg = 0x2000; /* NTLDR wants this address */
opt.loadfile = argv[i] + 6;
+ } else if (!strncmp(argv[i], "cmldr=", 6)) {
+ opt.seg = 0x2000; /* CMLDR wants this address */
+ opt.loadfile = argv[i] + 6;
+ opt.cmldr = true;
} else if (!strncmp(argv[i], "freedos=", 8)) {
opt.seg = 0x60; /* FREEDOS wants this address */
opt.loadfile = argv[i] + 8;
@@ -715,6 +724,7 @@ int main(int argc, char *argv[])
"Options: file=<loader> load file, instead of boot sector\n"
" isolinux=<loader> load another version of ISOLINUX\n"
" ntldr=<loader> load Windows bootloaders: NTLDR, SETUPLDR, BOOTMGR\n"
+ " cmldr=<loader> load Recovery Console of Windows NT/2K/XP\n"
" freedos=<loader> load FreeDOS kernel.sys\n"
" msdos=<loader> load MS-DOS io.sys\n"
" pcdos=<loader> load PC-DOS ibmbio.com\n"
@@ -876,6 +886,13 @@ int main(int argc, char *argv[])
}
}
+ /* To boot the Recovery Console of Windows NT/2K/XP we need to write
+ the string "cmdcons\0" to memory location 0000:7C03.
+ Memory location 0000:7C00 contains the bootsector of the partition.
+ */
+ if (opt.cmldr)
+ strcpy((char *) 0x7c03, "cmdcons");
+
} else if (partinfo) {
/* Actually read the boot sector */
/* Pick the first buffer that isn't already in use */