Author: hbelusca Date: Thu Jun 8 02:19:14 2017 New Revision: 74952
URL: http://svn.reactos.org/svn/reactos?rev=74952&view=rev Log: [SETUPLIB]: Make the NTOS_BOOT_ENTRY structure (that should actually be renamed...) more generic, so that it can wrap around either actual NTOS boot entry options, or FreeLdr-like boot-sector options. In a sense, the NTOS_BOOT_ENTRY structure now looks much more like the NT structure "BOOT_ENTRY". - Adapt the code in bldrsup.c to these modifications, and re-enable FreeLdr-like boot-sector-file support code that was commented out. More code cleaning-up will follow later.
Modified: branches/setup_improvements/base/setup/lib/bldrsup.c branches/setup_improvements/base/setup/lib/bldrsup.h
Modified: branches/setup_improvements/base/setup/lib/bldrsup.c URL: http://svn.reactos.org/svn/reactos/branches/setup_improvements/base/setup/li... ============================================================================== --- branches/setup_improvements/base/setup/lib/bldrsup.c [iso-8859-1] (original) +++ branches/setup_improvements/base/setup/lib/bldrsup.c [iso-8859-1] Thu Jun 8 02:19:14 2017 @@ -867,37 +867,52 @@ /* Create a new section */ IniSection = IniCacheAppendSection(BootStore->IniCache, Section);
- /* BootType= */ - IniCacheInsertKey(IniSection, NULL, INSERT_LAST, - L"BootType", BootEntry->Version); - - if (_wcsicmp(BootEntry->Version, L"Windows2003") == 0) - { + // if (_wcsicmp(BootEntry->Version, L"Windows2003") == 0) + if (BootEntry->OsOptionsLength >= sizeof(NTOS_OPTIONS) && + RtlCompareMemory(&BootEntry->OsOptions /* Signature */, + NTOS_OPTIONS_SIGNATURE, + RTL_FIELD_SIZE(NTOS_OPTIONS, Signature)) == + RTL_FIELD_SIZE(NTOS_OPTIONS, Signature)) + { + PNTOS_OPTIONS Options = (PNTOS_OPTIONS)&BootEntry->OsOptions; + + /* BootType= */ + IniCacheInsertKey(IniSection, NULL, INSERT_LAST, + L"BootType", L"Windows2003"); + /* SystemPath= */ IniCacheInsertKey(IniSection, NULL, INSERT_LAST, - L"SystemPath", (PWSTR)BootEntry->OsLoadPath); + L"SystemPath", (PWSTR)Options->OsLoadPath);
/* Options= */ IniCacheInsertKey(IniSection, NULL, INSERT_LAST, - L"Options", (PWSTR)BootEntry->OsLoadOptions); + L"Options", (PWSTR)Options->OsLoadOptions); } else - if (_wcsicmp(BootEntry->Version, L"BootSector") == 0) - { + // if (_wcsicmp(BootEntry->Version, L"BootSector") == 0) + if (BootEntry->OsOptionsLength >= sizeof(BOOT_SECTOR_OPTIONS) && + RtlCompareMemory(&BootEntry->OsOptions /* Signature */, + BOOT_SECTOR_OPTIONS_SIGNATURE, + RTL_FIELD_SIZE(BOOT_SECTOR_OPTIONS, Signature)) == + RTL_FIELD_SIZE(BOOT_SECTOR_OPTIONS, Signature)) + { + PBOOT_SECTOR_OPTIONS Options = (PBOOT_SECTOR_OPTIONS)&BootEntry->OsOptions; + + /* BootType= */ + IniCacheInsertKey(IniSection, NULL, INSERT_LAST, + L"BootType", L"BootSector"); + /* BootDrive= */ IniCacheInsertKey(IniSection, NULL, INSERT_LAST, - L"BootDrive", - /*BootDrive*/ (PWSTR)BootEntry->OsLoadPath); // OsLoadPath ?? - - // /* BootPartition= */ - // IniCacheInsertKey(IniSection, NULL, INSERT_LAST, - // L"BootPartition", - // BootPartition); // OsLoadPath + L"BootDrive", (PWSTR)Options->Drive); + + /* BootPartition= */ + IniCacheInsertKey(IniSection, NULL, INSERT_LAST, + L"BootPartition", (PWSTR)Options->Partition);
/* BootSector= */ IniCacheInsertKey(IniSection, NULL, INSERT_LAST, - L"BootSectorFile", - /*BootSector*/ (PWSTR)BootEntry->BootFilePath); + L"BootSectorFile", (PWSTR)Options->BootSectorFileName); } else { @@ -940,19 +955,25 @@ else if (BootStore->Type == NtLdr) { + PNTOS_OPTIONS Options = (PNTOS_OPTIONS)&BootEntry->OsOptions; PWCHAR Buffer; ULONG BufferLength; PCWSTR InstallName, OsOptions; // ULONG InstallNameLength, OsOptionsLength;
- if (_wcsicmp(BootEntry->Version, L"Windows2003") != 0) + // if (_wcsicmp(BootEntry->Version, L"Windows2003") != 0) + if (BootEntry->OsOptionsLength < sizeof(NTOS_OPTIONS) || + RtlCompareMemory(&BootEntry->OsOptions /* Signature */, + NTOS_OPTIONS_SIGNATURE, + RTL_FIELD_SIZE(NTOS_OPTIONS, Signature)) != + RTL_FIELD_SIZE(NTOS_OPTIONS, Signature)) { DPRINT1("Unsupported BootType '%S'\n", BootEntry->Version); return STATUS_SUCCESS; // STATUS_NOT_SUPPORTED; }
InstallName = BootEntry->FriendlyName; - OsOptions = BootEntry->OsLoadOptions; + OsOptions = Options->OsLoadOptions;
// if (InstallNameLength == 0) InstallName = NULL; // if (OsOptionsLength == 0) OsOptions = NULL; @@ -977,7 +998,7 @@
/* Insert the entry into the "Operating Systems" section */ IniCacheInsertKey(((PBOOT_STORE_INI_CONTEXT)BootStore)->OsIniSection, NULL, INSERT_LAST, - (PWSTR)BootEntry->OsLoadPath, Buffer); + (PWSTR)Options->OsLoadPath, Buffer);
RtlFreeHeap(ProcessHeap, 0, Buffer); return STATUS_SUCCESS; @@ -1216,8 +1237,9 @@ PINICACHEITERATOR Iterator; PINICACHESECTION OsIniSection; PWCHAR SectionName, KeyData; -/**/NTOS_BOOT_ENTRY xxBootEntry;/**/ - PNTOS_BOOT_ENTRY BootEntry = &xxBootEntry; + UCHAR xxBootEntry[FIELD_OFFSET(NTOS_BOOT_ENTRY, OsOptions) + + max(sizeof(NTOS_OPTIONS), sizeof(BOOT_SECTOR_OPTIONS))]; + PNTOS_BOOT_ENTRY BootEntry = (PNTOS_BOOT_ENTRY)&xxBootEntry; PWCHAR Buffer;
/* Enumerate all the valid installations listed in the "Operating Systems" section */ @@ -1272,10 +1294,8 @@ BootEntry->Version = NULL; BootEntry->BootEntryKey = MAKESTRKEY(SectionName); BootEntry->FriendlyName = InstallName; - BootEntry->OsLoadPath = NULL; BootEntry->BootFilePath = NULL; - // BootEntry->OsOptions = NULL; - BootEntry->OsLoadOptions = NULL; + BootEntry->OsOptionsLength = 0;
/* Search for an existing boot entry section */ OsIniSection = IniCacheGetSection(BootStore->IniCache, SectionName); @@ -1296,50 +1316,70 @@ (_wcsicmp(KeyData, L""Windows2003"") == 0)) { /* BootType is Windows2003 */ + PNTOS_OPTIONS Options = (PNTOS_OPTIONS)&BootEntry->OsOptions; + BootEntry->Version = L"Windows2003"; DPRINT1("This is a '%S' boot entry\n", BootEntry->Version); + + BootEntry->OsOptionsLength = sizeof(NTOS_OPTIONS); + RtlCopyMemory(Options->Signature, + NTOS_OPTIONS_SIGNATURE, + RTL_FIELD_SIZE(NTOS_OPTIONS, Signature)); + + // BootEntry->BootFilePath = NULL;
/* Check its SystemPath */ Status = IniCacheGetKey(OsIniSection, L"SystemPath", &KeyData); if (!NT_SUCCESS(Status)) - BootEntry->OsLoadPath = NULL; + Options->OsLoadPath = NULL; else - BootEntry->OsLoadPath = KeyData; + Options->OsLoadPath = KeyData; // KeyData == SystemRoot; - - BootEntry->BootFilePath = NULL; - // BootEntry->OsOptions = NULL;
/* Check the optional Options */ Status = IniCacheGetKey(OsIniSection, L"Options", &KeyData); if (!NT_SUCCESS(Status)) - BootEntry->OsLoadOptions = NULL; + Options->OsLoadOptions = NULL; else - BootEntry->OsLoadOptions = KeyData; + Options->OsLoadOptions = KeyData; } else if ((_wcsicmp(KeyData, L"BootSector") == 0) || (_wcsicmp(KeyData, L""BootSector"") == 0)) { /* BootType is BootSector */ + PBOOT_SECTOR_OPTIONS Options = (PBOOT_SECTOR_OPTIONS)&BootEntry->OsOptions; + BootEntry->Version = L"BootSector"; DPRINT1("This is a '%S' boot entry\n", BootEntry->Version); + + BootEntry->OsOptionsLength = sizeof(BOOT_SECTOR_OPTIONS); + RtlCopyMemory(Options->Signature, + BOOT_SECTOR_OPTIONS_SIGNATURE, + RTL_FIELD_SIZE(BOOT_SECTOR_OPTIONS, Signature)); + + // BootEntry->BootFilePath = NULL;
/* Check its BootDrive */ Status = IniCacheGetKey(OsIniSection, L"BootDrive", &KeyData); if (!NT_SUCCESS(Status)) - BootEntry->OsLoadPath = NULL; + Options->Drive = NULL; else - BootEntry->OsLoadPath = KeyData; - - /* FIXME: Check its BootPartition ???? */ + Options->Drive = KeyData; + + /* Check its BootPartition */ + Status = IniCacheGetKey(OsIniSection, L"BootPartition", &KeyData); + if (!NT_SUCCESS(Status)) + Options->Partition = NULL; + else + Options->Partition = KeyData;
/* Check its BootSector */ Status = IniCacheGetKey(OsIniSection, L"BootSectorFile", &KeyData); if (!NT_SUCCESS(Status)) - BootEntry->BootFilePath = NULL; + Options->BootSectorFileName = NULL; else - BootEntry->BootFilePath = KeyData; + Options->BootSectorFileName = KeyData; } else { @@ -1376,8 +1416,9 @@ NTSTATUS Status = STATUS_SUCCESS; PINICACHEITERATOR Iterator; PWCHAR SectionName, KeyData; -/**/NTOS_BOOT_ENTRY xxBootEntry;/**/ - PNTOS_BOOT_ENTRY BootEntry = &xxBootEntry; + UCHAR xxBootEntry[FIELD_OFFSET(NTOS_BOOT_ENTRY, OsOptions) + sizeof(NTOS_OPTIONS)]; + PNTOS_BOOT_ENTRY BootEntry = (PNTOS_BOOT_ENTRY)&xxBootEntry; + PNTOS_OPTIONS Options = (PNTOS_OPTIONS)&BootEntry->OsOptions; PWCHAR Buffer; ULONG BufferLength;
@@ -1472,10 +1513,15 @@ BootEntry->Version = L"Windows2003"; BootEntry->BootEntryKey = 0; // FIXME?? BootEntry->FriendlyName = InstallName; - BootEntry->OsLoadPath = SectionName; BootEntry->BootFilePath = NULL; - // BootEntry->OsOptions = NULL; - BootEntry->OsLoadOptions = OsOptions; + + BootEntry->OsOptionsLength = sizeof(NTOS_OPTIONS); + RtlCopyMemory(Options->Signature, + NTOS_OPTIONS_SIGNATURE, + RTL_FIELD_SIZE(NTOS_OPTIONS, Signature)); + + Options->OsLoadPath = SectionName; + Options->OsLoadOptions = OsOptions;
/* Call the user enumeration routine callback */ Status = EnumBootEntriesRoutine(NtLdr, BootEntry, Parameter);
Modified: branches/setup_improvements/base/setup/lib/bldrsup.h URL: http://svn.reactos.org/svn/reactos/branches/setup_improvements/base/setup/li... ============================================================================== --- branches/setup_improvements/base/setup/lib/bldrsup.h [iso-8859-1] (original) +++ branches/setup_improvements/base/setup/lib/bldrsup.h [iso-8859-1] Thu Jun 8 02:19:14 2017 @@ -11,7 +11,7 @@
#pragma once
-typedef enum _NTOS_BOOT_LOADER_TYPE +typedef enum _NTOS_BOOT_LOADER_TYPE // _BOOT_STORE_TYPE { FreeLdr, // ReactOS' FreeLoader NtLdr, // Windows <= 2k3 NT "FlexBoot" OS Loader NTLDR @@ -29,7 +29,7 @@ * This structure is inspired from the EFI boot entry structure * BOOT_OPTIONS that is defined in ndk/iotypes.h . */ -typedef struct _NTOS_BOOT_OPTIONS +typedef struct _NTOS_BOOT_OPTIONS // _BOOT_STORE_OPTIONS { // ULONG Version; // ULONG Length; @@ -60,7 +60,7 @@ * This structure is inspired from the EFI boot entry structures * BOOT_ENTRY and FILE_PATH that are defined in ndk/iotypes.h . */ -typedef struct _NTOS_BOOT_ENTRY +typedef struct _NTOS_BOOT_ENTRY // _BOOT_STORE_ENTRY { // ULONG Version; // Equivalent of the "BootType" in FreeLdr PWCHAR Version; // HACK!!! @@ -68,10 +68,50 @@ ULONG_PTR BootEntryKey; // Boot entry "key" PCWSTR FriendlyName; // Human-readable boot entry description // LoadIdentifier PCWSTR BootFilePath; // Path to e.g. osloader.exe, or winload.efi // EfiOsLoaderFilePath - PCWSTR OsLoadPath; // The OS SystemRoot path // OsLoaderFilePath - // PCWSTR OsOptions; // OsLoadOptions - PCWSTR OsLoadOptions; + ULONG OsOptionsLength; // Loader-specific options blob (can be a string, or a binary structure...) + UCHAR OsOptions[ANYSIZE_ARRAY]; +/* + * In packed form, this structure would contain offsets to 'FriendlyName' + * and 'BootFilePath' strings and, after the OsOptions blob, there would + * be the following data: + * + * WCHAR FriendlyName[ANYSIZE_ARRAY]; + * FILE_PATH BootFilePath; + */ } NTOS_BOOT_ENTRY, *PNTOS_BOOT_ENTRY; + +/* "NTOS" (aka. ReactOS or MS Windows NT) <= 5.x options */ +typedef struct _NTOS_OPTIONS +{ + UCHAR Signature[8]; // "NTOS_5\0\0" + // ULONG Version; + // ULONG Length; + PCWSTR OsLoadPath; // The OS SystemRoot path // OsLoaderFilePath // OsFilePath + PCWSTR OsLoadOptions; // OsLoadOptions +/* + * In packed form, this structure would contain an offset to the 'OsLoadPath' + * string, and the 'OsLoadOptions' member would be: + * WCHAR OsLoadOptions[ANYSIZE_ARRAY]; + * followed by: + * FILE_PATH OsLoadPath; + */ +} NTOS_OPTIONS, *PNTOS_OPTIONS; + +#define NTOS_OPTIONS_SIGNATURE "NTOS_5\0\0" + +/* Options for boot-sector boot entries */ +typedef struct _BOOT_SECTOR_OPTIONS +{ + UCHAR Signature[8]; // "BootSect" + // ULONG Version; + // ULONG Length; + PCWSTR Drive; + PCWSTR Partition; + PCWSTR BootSectorFileName; +} BOOT_SECTOR_OPTIONS, *PBOOT_SECTOR_OPTIONS; + +#define BOOT_SECTOR_OPTIONS_SIGNATURE "BootSect" +
typedef NTSTATUS (NTAPI *PENUM_BOOT_ENTRIES_ROUTINE)(