aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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 */