diff options
-rw-r--r-- | com32/modules/chain.c | 17 |
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 */ |