[FREELDR] Add "WindowsVista" boot type
[FREELDR] Set GDT correctly for Vista
[FREELDR] Map first page of memory, this is an observed behavior, and
also increases stability boot Checked windows 2003 SP2 ntoskrnl with
freeloader.
[SDK] Don't assert on big keys in bootloader
Co-authored-by: Justin Miller <justin.miller@reactos.org>
They are correct and are more performant.
- Rewrite WinLdrAddDriverToList() on the model of CmpAddDriverToList()
with support for CmpIsDriverInList().
- Disable RegEnumKey() as it is now unused.
This allows: (i) to shorten dramatically the lengths of the static
registry path strings being used (and thus, allow for reduced binary
file size), and (ii) to prepare future support for selecting different
control sets (and related Last-Known-Good configurations).
- Move boot options parsing early on in LoadWindowsCore().
- Add WinLdrIsPaeSupported(), move in it the PAE options parsing.
The aim is to perform other tests to determine whether or not to
enable PAE, and select an adequate kernel image.
Co-authored-by: Vadim Galyant <vgal@rambler.ru>
- Fix parsing of the NOEXECUTE options, taking their precedence
into account. Most of these are also x86-specific.
A Kernel Debugger Transport DLL is always loaded for Windows XP+ :
either the standard KDCOM.DLL (by default), or an alternative
user-provided one via the /DEBUGPORT= option. If this alternative
does not exist or fails to be loaded, fall back to the standard
KDCOM.DLL.
If no KD dll is loaded, kernel loading would fail because of the
resulting unsatisfied KDCOM dll import (tested on Windows and ReactOS).
+ Normalize kernel, HAL and KD dll file names to lowercase (needed for
case-sensitive installations).
CORE-9023, CORE-18033
- Reset the UI to a minimal one in SOS mode.
- In SOS mode, a trace of loaded files is displayed on the screen,
instead of the usual progress bar.
- Add a callback to the PE loader to notify when imported DLLs are
loaded for a main image. This allows getting an accurate SOS trace.
- Remove excessive UiDrawBackdrop() calls that caused too many
unnecessary redraws.
- ProgressBar: Clear only the portions that need to be cleared up.
This allows to not use DrawBackdrop anymore and the flickering.
Actually, RegCloseKey() is here a dummy macro that just "returns"
success. Indeed, the internal implementation of RegOpenKey() doesn't
really allocate internal structures: it just returns a "pointer" to
already existing allocated data. Therefore nothing needs to be closed/freed
later on.
- Move a few lines around.
- Switch to RtlZeroMemory() from memset().
- Make while() more explicit.
For CORE-12802:
- Add/Fix FrLdrHeapAlloc() failure handling and related.
Especially, add/fix FrLdrHeapFree() calls.
- Add/Improve ERR() to some FrLdrHeapAlloc() failure cases.
Co-authored-by: Hermès BÉLUSCA - MAÏTO <hermes.belusca-maito@reactos.org>
- Introduce a set of NtLdrGet(Next)Option(Ex) helpers that allow
retrieving respectively, the "next" option in an options string,
and retrieving a given named option in such an options string,
by correctly parsing that string.
Valid syntaxes:
/OPTION1 /OPTION2/OPTION3 OPTION4 /OPTION5(=...) ...
Options separators are slashes, or whitespace (space, tab), mandatory
if no slash is used, and otherwise optional.
- Use these functions wherever NT load options are being parsed.
- Simplify the parsing of /DEBUGPORT=... using these functions.
- When parsing the /HAL=... or /KERNEL=... options, only the first
encountered one is taken into account, any other ones are discarded.
- When parsing the other load options, only their first occurrences are
taken into account, any other repetitions are discarded.
* The NOPAE option overrides any previous PAE option.
* Any NOEXECUTE(=) option should override any previous
NOEXECUTE=ALWAYSOFF (or equivalently, EXECUTE) option.
This parameter is not needed since it's possible to determine, from
within this function, whether or not we are in Setup mode, by just
looking for the presence of a non NULL LoaderBlock->SetupLdrBlock.
- Implement support for the "RDIMAGELENGTH" and "RDIMAGEOFFSET" boot
options. Fixes CORE-15432.
- Separate the initialization of the global gInitRamDiskBase /
gInitRamDiskSize variables from the FreeLdr command-line, and the
actual initialization of the internal variables of the RamDisk.
The latter are initialized via calls to RamDiskInitialize().
- Implement 'SeekRelative' mode in RamDiskSeek().
- Make RamDiskLoadVirtualFile() internal function that gets called by
RamDiskInitialize(), and we use the latter in the NT loader instead.
On Windows <= 2003 (and current ReactOS), this is the "InfName" value
in the "HKEY_LOCAL_MACHINE\CurrentControlSet\Control\BiosInfo\" key.
(The default file name found there is 'biosinfo.inf'.)
On Vista+, this is the "InfName" value in the
"HKEY_LOCAL_MACHINE\CurrentControlSet\Control\Errata\" key.
(The default file name found there is 'errata.inf'.)
For 1st-stage setup, the file is specified in the "InfName" value of
the "BiosInfo" section in the TXTSETUP.SIF file.
Co-authored-by: Hermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
CORE-9023
FIXES:
======
- Fix parsing of the multiboot options string.
NOTE: They are not yet treated in a case-insensitive manner!
- Fix a bug in ArcOpen() so that it correctly skips the first path
separator (after the adapter-controller-peripheral ARC descriptors).
The path separator can be either a backslash or a slash (both are
allowed according to the specs); they were also already handled
correctly in other parts of the code.
- Fix DissectArcPath() so as to:
* **OPTIONALLY** (and not mandatorily!) return the path part that follows
the ARC adapter-controller-peripheral elements in the ARC path;
* make it correctly handle the (yes, optional!!) partition() part in the
ARC path, for the multi(x)disk(y)rdisk(z) cases.
ENHANCEMENTS:
=============
- Directly retrieve the default OS entry as we enumerate them and
build their list (i.e. merge the GetDefaultOperatingSystem() helper
within InitOperatingSystemList()).
- Directly use the opened 'FreeLoader' INI section via its ID in the
different functions that need it.
- Make the custom-boot and linux loaders honour the boot options they are
supposed to support (see FREELDR.INI documentation / template).
This includes the 'BootDrive' and 'BootPartition' (alternatively the ARC
'BootPath').
This also allows them to take into account the user-specified choices in the
FreeLdr custom-boot editors.
- Modify the FreeLdr custom-boot editors so as to correctly honour
the priorities of the boot options as specified in the FREELDR.INI
documentation / template.
- Use stack trick (union of structs) to reduce stack usage in the
FreeLdr custom-boot editors, because there are strings buffers that are
used in an alternate manner.
- Extract out from the editors the LoadOperatingSystem() calls, and
move it back into OptionMenuCustomBoot(), so that when this latter
function is called there is no risk of having a stack almost full.
- When building the ARC-compatible argument vector for the loaders, add
the mandatory "SystemPartition" path. This allows the loaders to NOT
call the machine-specific MachDiskGetBootPath() later on (this data is
indeed passed to them by the boot manager part of FreeLdr).
- Improve the FsOpenFile() helper so as to make it:
* return an adequate ARC_STATUS instead of a mere uninformative BOOLEAN;
* take open options, as well as a default path (optional) that would be
prepended to the file name in case the latter is a relative one.
- Make RamDiskLoadVirtualFile() return an actual descriptive ARC_STATUS
value, and make it take an optional default path (same usage as the one
in FsOpenFile() ).
+ Remove useless NTAPI .
- UiInitialize() and TuiTextToColor(), TuiTextToFillStyle(): load or
convert named settings into corresponding values using setting table and
a tight for-loop, instead of duplicating 10x the same parameter reading
logic.
- UiInitialize(): Open the "Display" INI section just once. Remove usage
of DisplayModeText[] buffer.
- UiShowMessageBoxesInSection() and UiShowMessageBoxesInArgv(): reduce
code indentation level.
ENHANCEMENTS for NT OS loader:
==============================
- Don't use MachDiskGetBootPath() but use instead the "SystemPartition"
value passed via the ARC argument vector by the boot manager
(+ validation checks). Use it as the "default path" when calling
FsOpenFile() or loading the ramdisk.
- Honour the FreeLdr-specific "Hal=" and "Kernel=" options by converting
them into NT standard "/HAL=" and "/KERNEL=" options in the boot
command line.
Note that if the latter ones are already present on the standard "Options="
option line, they would take precedence over those passed via the separate
"Hal=" and "Kernel=" FreeLdr-specific options.
Also add some documentation links to Geoff Chappell's website about
how the default HAL and KERNEL names are chosen depending on the
detected underlying platform on which the NT OS loader is running.
CORE-9023
- During loading and initialization of the list of operating systems
available in freeldr.ini, convert any legacy operating system entry
encountered -- they are like those in NTLDR's boot.ini file, i.e.:
ArcOsLoadPartition="LoadIdentifier" /List /of /Options
into a new operating system INI entry, like those used by default in
FreeLoader. This allows us to avoid treating this corner-case later in
different parts of the code. Also, the "BootType" value is now
determined there, only once.
- Convert the OS loaders entry-points to ARC-compatible ones, following
the "Advanced RISC Computing Specification, Version 1.2" specification
https://www.netbsd.org/docs/Hardware/Machines/ARC/riscspec.pdf
- Introduce helpers for retrieving options values from the argument vector
in a simple way.
- Simplify LoadOperatingSystem(), since now the "BootType" value has
been determined once while loading the list of OSes (see above) and
is well-defined there. Use the BuildArgvForOsLoader() helper to build
the ARC-compatible argument vector from the corresponding INI settings
for the selected operating system entry, and use it when calling the
corresponding OS loader.
- In the OS loaders, since we can now directly read the settings from
the argument vector (instead of using INI settings), we can avoid
using a bunch of fixed-size string buffers, and avoid potentially
failing IniOpenSection() calls as well.
- Simplify code in the Linux loader (and the RemoveQuotes() function).
- Add UiShowMessageBoxesInArgv() that acts on the "MessageBox=" settings
passed through the argument vector (equivalent to
UiShowMessageBoxesInSection() ).
- Use string-safe functions where needed (copy/concatenation/printf on
fixed-size buffers).
- Initialize BootPath and BootOptions buffers when fallback behaviour is not taken.
- Correctly skip all the understood whitespace (space & tabs) and the
quotes before reading the boot options when using the alternative syntax:
[Operating Systems]
section_name = "ReactOS" /bootoptions
Fixes the minor regression introduced in 370e8564 (r43875).
CORE-16116
- This allows getting the /NOGUIBOOT mode working correctly, as the latter
expects text-mode. Then, usetup (via BLUE driver) will change to a
different text-mode, or, GUI boot will change (via BOOTVID) to VGA
640*480 16-color.
- Always hide the VGA cursor.
- Remove also the deprecated boolean "Setup" in the *PrepareForReactOS()
functions.
Co-authored-by: Hermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
- Introduce the AddReactOSArcDiskInfo() helper to get rid of the
duplicated reactos_arc_disk_info usage scattered amongst different
files.
- GetHarddiskInformation(): If we cannot read the disk that has been
enumerated by the BIOS, return a default identifier string.
- GetHarddiskInformation(): The last character of the disk identifier
string corresponds to whether its MBR is "valid"/has the 0xAA55
signature (use 'A') or whether it's not (use 'X'). Tested on Windows.
- Split PcInitializeBootDevices() in two: the first part of this
function that enumerates hard disks from the BIOS is now moved into
EnumerateHarddisks().
- The 'ValidPartitionTable' field of the ARC disk signature records must
be initialized with correct value that is specified in the different
AddReactOSArcDiskInfo() calls.
We now run the 1st-stage setup with a regular system hive, similarly to
what's done for the LiveCD, or for a regular ROS installation.
The ExpInTextModeSetup hacks I previously removed are now completely unneeded.
svn path=/branches/setup_improvements/; revision=74762
Split the "main" winldr.h header into the one containing global code
that actually doesn't really depend on the "windows" NT loader part,
and one that actually concerns code just for the NT Loader.
The latter goes into "ntldr".
svn path=/branches/setup_improvements/; revision=74743
Volume boot record is also implemented, it supports reading BTRFS tree structures with upto 64k node size.
This support required to change all path in Free Loader to lowercase for better performance.
CORE-13769