From 5dd0b32799cf1303786aea2a48d995046837b632 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sun, 13 Dec 2020 21:49:59 +0100 Subject: [PATCH] [FREELDR] EMS boot options: Parse NT kernel load options in a consistent manner. Addendum to d887308b. In particular the parsing should not care about the letter case. --- boot/freeldr/freeldr/ntldr/headless.c | 64 +++++++++++++-------------- 1 file changed, 31 insertions(+), 33 deletions(-) diff --git a/boot/freeldr/freeldr/ntldr/headless.c b/boot/freeldr/freeldr/ntldr/headless.c index 161e66420ae..911e08cb2e5 100644 --- a/boot/freeldr/freeldr/ntldr/headless.c +++ b/boot/freeldr/freeldr/ntldr/headless.c @@ -10,6 +10,7 @@ #include #include +#include "ntldropts.h" /* Note: Move these to some smbios.h header */ #define SYSID_TYPE_UUID "_UUID_" @@ -206,7 +207,7 @@ WinLdrInitializeHeadlessPort(VOID) { ULONG PortNumber, BaudRate; PUCHAR PortAddress; - PCHAR AnsiReset = "\x1B[m"; + PCSTR AnsiReset = "\x1B[m"; ULONG i; PortNumber = LoaderRedirectionInformation.PortNumber; @@ -267,13 +268,11 @@ WinLdrInitializeHeadlessPort(VOID) /* Call arch code to initialize the port */ PortAddress = LoaderRedirectionInformation.PortAddress; - WinLdrTerminalConnected = WinLdrPortInitialize( - BaudRate, - PortNumber, - PortAddress, - WinLdrTerminalConnected, - &WinLdrTerminalDeviceId); - + WinLdrTerminalConnected = WinLdrPortInitialize(BaudRate, + PortNumber, + PortAddress, + WinLdrTerminalConnected, + &WinLdrTerminalDeviceId); if (WinLdrTerminalConnected) { /* Port seems usable, set it up and get the BIOS GUID */ @@ -302,55 +301,54 @@ WinLdrInitializeHeadlessPort(VOID) VOID WinLdrSetupEms(IN PCSTR BootOptions) { - PCHAR Settings, RedirectPort; + PCSTR Option; /* Start fresh */ RtlZeroMemory(&LoaderRedirectionInformation, sizeof(HEADLESS_LOADER_BLOCK)); LoaderRedirectionInformation.PciDeviceId = PCI_INVALID_VENDORID; /* Use a direction port if one was given, or use ACPI to detect one instead */ - Settings = strstr(BootOptions, "/redirect="); - if (Settings) + Option = NtLdrGetOption(BootOptions, "redirect="); + if (Option) { - RedirectPort = strstr(Settings, "com"); - if (RedirectPort) + Option += 9; + if (_strnicmp(Option, "com", 3) == 0) { - RedirectPort += sizeof("com") - 1; - LoaderRedirectionInformation.PortNumber = atoi(RedirectPort); - LoaderRedirectionInformation.TerminalType = 1; // HeadlessSerialPort + Option += 3; + LoaderRedirectionInformation.PortNumber = atoi(Option); + LoaderRedirectionInformation.TerminalType = 1; // VT100+ + } + else if (_strnicmp(Option, "usebiossettings", 15) == 0) + { + // FIXME: TODO! + UiDrawStatusText("ACPI SRT/SPCR Table Not Supported..."); + return; } else { - RedirectPort = strstr(Settings, "usebiossettings"); - if (RedirectPort) + LoaderRedirectionInformation.PortAddress = (PUCHAR)strtoul(Option, 0, 16); + if (LoaderRedirectionInformation.PortAddress) { - UiDrawStatusText("ACPI SRT Table Not Supported..."); - return; - } - else - { - LoaderRedirectionInformation.PortAddress = (PUCHAR)strtoul(Settings, 0, 16); - if (LoaderRedirectionInformation.PortAddress) - { - LoaderRedirectionInformation.PortNumber = 3; - } + LoaderRedirectionInformation.PortNumber = 3; } } } /* Use a direction baudrate if one was given */ - Settings = strstr(BootOptions, "/redirectbaudrate="); - if (Settings) + Option = NtLdrGetOption(BootOptions, "redirectbaudrate="); + if (Option) { - if (strstr(Settings, "115200")) + Option += 17; + // LoaderRedirectionInformation.BaudRate = atoi(Option); + if (strncmp(Option, "115200", 6) == 0) { LoaderRedirectionInformation.BaudRate = 115200; } - else if (strstr(Settings, "57600")) + else if (strncmp(Option, "57600", 5) == 0) { LoaderRedirectionInformation.BaudRate = 57600; } - else if (strstr(Settings, "19200")) + else if (strncmp(Option, "19200", 5) == 0) { LoaderRedirectionInformation.BaudRate = 19200; }