Skip to content

Commit 7c00769

Browse files
committed
[FREELDR] Split LoaderBlock and Extension into sub-blocks
1 parent ca4a467 commit 7c00769

File tree

8 files changed

+407
-177
lines changed

8 files changed

+407
-177
lines changed
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
/*
2+
* PROJECT: FreeLoader
3+
* LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4+
* PURPOSE: Windows-compatible NT Loader Block.
5+
* COPYRIGHT: Copyright 2006-2019 Aleksey Bragin <[email protected]>
6+
*/
7+
8+
#pragma once
9+
10+
#include <arc/setupblk.h>
11+
12+
typedef struct _LOADER_PARAMETER_BLOCK1
13+
{
14+
LIST_ENTRY LoadOrderListHead;
15+
LIST_ENTRY MemoryDescriptorListHead;
16+
LIST_ENTRY BootDriverListHead;
17+
ULONG_PTR KernelStack;
18+
ULONG_PTR Prcb;
19+
ULONG_PTR Process;
20+
ULONG_PTR Thread;
21+
ULONG RegistryLength;
22+
PVOID RegistryBase;
23+
PCONFIGURATION_COMPONENT_DATA ConfigurationRoot;
24+
PSTR ArcBootDeviceName;
25+
PSTR ArcHalDeviceName;
26+
PSTR NtBootPathName;
27+
PSTR NtHalPathName;
28+
PSTR LoadOptions;
29+
PNLS_DATA_BLOCK NlsData;
30+
PARC_DISK_INFORMATION ArcDiskInformation;
31+
PVOID OemFontFile;
32+
} LOADER_PARAMETER_BLOCK1, *PLOADER_PARAMETER_BLOCK1;
33+
34+
typedef struct _LOADER_PARAMETER_BLOCK2
35+
{
36+
PVOID Extension;
37+
union
38+
{
39+
I386_LOADER_BLOCK I386;
40+
ALPHA_LOADER_BLOCK Alpha;
41+
IA64_LOADER_BLOCK IA64;
42+
PPC_LOADER_BLOCK PowerPC;
43+
ARM_LOADER_BLOCK Arm;
44+
} u;
45+
FIRMWARE_INFORMATION_LOADER_BLOCK FirmwareInformation;
46+
} LOADER_PARAMETER_BLOCK2, *PLOADER_PARAMETER_BLOCK2;
47+
48+
typedef struct _LOADER_PARAMETER_BLOCK_VISTA
49+
{
50+
LOADER_PARAMETER_BLOCK1 Block1;
51+
PSETUP_LOADER_BLOCK SetupLdrBlock;
52+
LOADER_PARAMETER_BLOCK2 Block2;
53+
} LOADER_PARAMETER_BLOCK_VISTA, *PLOADER_PARAMETER_BLOCK_VISTA;
54+
55+
typedef struct _LOADER_PARAMETER_EXTENSION1
56+
{
57+
ULONG Size;
58+
PROFILE_PARAMETER_BLOCK Profile;
59+
} LOADER_PARAMETER_EXTENSION1, *PLOADER_PARAMETER_EXTENSION1;
60+
61+
#include <pshpack1.h>
62+
63+
typedef struct _LOADER_PARAMETER_EXTENSION2
64+
{
65+
PVOID EmInfFileImage;
66+
ULONG_PTR EmInfFileSize;
67+
PVOID TriageDumpBlock;
68+
//
69+
// NT 5.1
70+
//
71+
ULONG_PTR LoaderPagesSpanned; /* Not anymore present starting NT 6.2 */
72+
PHEADLESS_LOADER_BLOCK HeadlessLoaderBlock;
73+
PSMBIOS_TABLE_HEADER SMBiosEPSHeader;
74+
PVOID DrvDBImage;
75+
ULONG_PTR DrvDBSize;
76+
PNETWORK_LOADER_BLOCK NetworkLoaderBlock;
77+
//
78+
// NT 5.2+
79+
//
80+
#ifdef _X86_
81+
PUCHAR HalpIRQLToTPR;
82+
PUCHAR HalpVectorToIRQL;
83+
#endif
84+
LIST_ENTRY FirmwareDescriptorListHead;
85+
PVOID AcpiTable;
86+
ULONG_PTR AcpiTableSize;
87+
//
88+
// NT 5.2 SP1+
89+
//
90+
/** NT-version-dependent flags **/
91+
ULONG_PTR BootViaWinload:1;
92+
ULONG_PTR BootViaEFI:1;
93+
ULONG_PTR Reserved:30;
94+
/********************************/
95+
PLOADER_PERFORMANCE_DATA LoaderPerformanceData;
96+
LIST_ENTRY BootApplicationPersistentData;
97+
PVOID WmdTestResult;
98+
GUID BootIdentifier;
99+
//
100+
// NT 6
101+
//
102+
ULONG_PTR ResumePages;
103+
PVOID DumpHeader;
104+
} LOADER_PARAMETER_EXTENSION2, *PLOADER_PARAMETER_EXTENSION2;
105+
106+
typedef struct _LOADER_PARAMETER_EXTENSION_VISTA
107+
{
108+
LOADER_PARAMETER_EXTENSION1 Extension1;
109+
ULONG MajorVersion;
110+
ULONG MinorVersion;
111+
LOADER_PARAMETER_EXTENSION2 Extension2;
112+
} LOADER_PARAMETER_EXTENSION_VISTA, *PLOADER_PARAMETER_EXTENSION_VISTA;
113+
114+
#include <poppack.h>

boot/freeldr/freeldr/ntldr/arch/amd64/winldr.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -371,14 +371,14 @@ WinLdrSetProcessorContext(
371371
TRACE("leave WinLdrSetProcessorContext\n");
372372
}
373373

374-
void WinLdrSetupMachineDependent(PLOADER_PARAMETER_BLOCK LoaderBlock)
374+
void WinLdrSetupMachineDependent(PLOADER_PARAMETER_BLOCK2 LoaderBlock2)
375375
{
376376
PVOID SharedUserDataAddress = NULL;
377377
ULONG_PTR Tss = 0;
378378
ULONG BlockSize, NumPages;
379379

380-
LoaderBlock->u.I386.CommonDataArea = (PVOID)DbgPrint; // HACK
381-
LoaderBlock->u.I386.MachineType = MACHINE_TYPE_ISA;
380+
LoaderBlock2->u.I386.CommonDataArea = (PVOID)DbgPrint; // HACK
381+
LoaderBlock2->u.I386.MachineType = MACHINE_TYPE_ISA;
382382

383383
/* Allocate 1 page for SharedUserData */
384384
SharedUserDataAddress = MmAllocateMemoryWithType(MM_PAGE_SIZE, LoaderStartupPcrPage);

boot/freeldr/freeldr/ntldr/arch/i386/winldr.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -368,16 +368,16 @@ void WinLdrSetupSpecialDataPointers(VOID)
368368
}
369369
}
370370

371-
void WinLdrSetupMachineDependent(PLOADER_PARAMETER_BLOCK LoaderBlock)
371+
void WinLdrSetupMachineDependent(PLOADER_PARAMETER_BLOCK2 LoaderBlock2)
372372
{
373373
ULONG TssSize;
374374
//ULONG TssPages;
375375
ULONG_PTR Pcr = 0;
376376
ULONG_PTR Tss = 0;
377377
ULONG BlockSize, NumPages;
378378

379-
LoaderBlock->u.I386.CommonDataArea = NULL; // Force No ABIOS support
380-
LoaderBlock->u.I386.MachineType = MACHINE_TYPE_ISA;
379+
LoaderBlock2->u.I386.CommonDataArea = NULL; // Force No ABIOS support
380+
LoaderBlock2->u.I386.MachineType = MACHINE_TYPE_ISA;
381381

382382
/* Allocate 2 pages for PCR: one for the boot processor PCR and one for KI_USER_SHARED_DATA */
383383
Pcr = (ULONG_PTR)MmAllocateMemoryWithType(2 * MM_PAGE_SIZE, LoaderStartupPcrPage);

boot/freeldr/freeldr/ntldr/setupldr.c

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,16 @@ DBG_DEFAULT_CHANNEL(WINDOWS);
1919
VOID
2020
AllocateAndInitLPB(
2121
IN USHORT VersionToBoot,
22-
OUT PLOADER_PARAMETER_BLOCK* OutLoaderBlock);
22+
OUT PVOID* OutLoaderBlock,
23+
OUT PLOADER_PARAMETER_BLOCK1* OutLoaderBlock1,
24+
OUT PLOADER_PARAMETER_BLOCK2* OutLoaderBlock2,
25+
OUT PSETUP_LOADER_BLOCK** SetupBlockPtr,
26+
OUT PLOADER_PARAMETER_EXTENSION1* OutExtension1,
27+
OUT PLOADER_PARAMETER_EXTENSION2* OutExtension2);
2328

2429
static VOID
2530
SetupLdrLoadNlsData(
26-
_Inout_ PLOADER_PARAMETER_BLOCK LoaderBlock,
31+
_Inout_ PLOADER_PARAMETER_BLOCK1 LoaderBlock1,
2732
_In_ HINF InfHandle,
2833
_In_ PCSTR SearchPath)
2934
{
@@ -76,7 +81,7 @@ SetupLdrLoadNlsData(
7681
&AnsiFileName, &OemFileName, &LangFileName, &OemHalFileName);
7782

7883
/* Load NLS data */
79-
Success = WinLdrLoadNLSData(LoaderBlock,
84+
Success = WinLdrLoadNLSData(LoaderBlock1,
8085
SearchPath,
8186
&AnsiFileName,
8287
&OemFileName,
@@ -95,7 +100,7 @@ SetupLdrLoadNlsData(
95100
static
96101
BOOLEAN
97102
SetupLdrInitErrataInf(
98-
IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock,
103+
IN OUT PLOADER_PARAMETER_EXTENSION2 Extension2,
99104
IN HINF InfHandle,
100105
IN PCSTR SystemRoot)
101106
{
@@ -128,8 +133,8 @@ SetupLdrInitErrataInf(
128133
return FALSE;
129134
}
130135

131-
LoaderBlock->Extension->EmInfFileImage = PaToVa(PhysicalBase);
132-
LoaderBlock->Extension->EmInfFileSize = FileSize;
136+
Extension2->EmInfFileImage = PaToVa(PhysicalBase);
137+
Extension2->EmInfFileSize = FileSize;
133138

134139
return TRUE;
135140
}
@@ -488,8 +493,13 @@ LoadReactOSSetup(
488493
HINF InfHandle;
489494
INFCONTEXT InfContext;
490495
ULONG i, ErrorLine;
491-
PLOADER_PARAMETER_BLOCK LoaderBlock;
496+
PVOID LoaderBlock;
497+
PLOADER_PARAMETER_BLOCK1 LoaderBlock1;
498+
PLOADER_PARAMETER_BLOCK2 LoaderBlock2;
499+
PSETUP_LOADER_BLOCK* SetupBlockPtr;
492500
PSETUP_LOADER_BLOCK SetupBlock;
501+
PLOADER_PARAMETER_EXTENSION1 Extension1;
502+
PLOADER_PARAMETER_EXTENSION2 Extension2;
493503
CHAR BootPath[MAX_PATH];
494504
CHAR FilePath[MAX_PATH];
495505
CHAR UserBootOptions[256];
@@ -773,18 +783,19 @@ LoadReactOSSetup(
773783
UiResetForSOS();
774784

775785
/* Allocate and minimally-initialize the Loader Parameter Block */
776-
AllocateAndInitLPB(_WIN32_WINNT_WS03, &LoaderBlock);
786+
AllocateAndInitLPB(_WIN32_WINNT_WS03, &LoaderBlock,
787+
&LoaderBlock1, &LoaderBlock2, &SetupBlockPtr, &Extension1, &Extension2);
777788

778789
/* Allocate and initialize the setup loader block */
779790
SetupBlock = &WinLdrSystemBlock->SetupBlock;
780-
LoaderBlock->SetupLdrBlock = SetupBlock;
791+
*SetupBlockPtr = SetupBlock;
781792

782793
/* Set textmode setup flag */
783794
SetupBlock->Flags = SETUPLDR_TEXT_MODE;
784795

785796
/* Load the "setupreg.hiv" setup system hive */
786797
UiUpdateProgressBar(15, "Loading setup system hive...");
787-
Success = WinLdrInitSystemHive(LoaderBlock, BootPath, TRUE);
798+
Success = WinLdrInitSystemHive(LoaderBlock1, BootPath, TRUE);
788799
TRACE("Setup SYSTEM hive %s\n", (Success ? "loaded" : "not loaded"));
789800
/* Bail out if failure */
790801
if (!Success)
@@ -793,17 +804,17 @@ LoadReactOSSetup(
793804
/* Load NLS data, they are in the System32 directory of the installation medium */
794805
RtlStringCbCopyA(FilePath, sizeof(FilePath), BootPath);
795806
RtlStringCbCatA(FilePath, sizeof(FilePath), "system32\\");
796-
SetupLdrLoadNlsData(LoaderBlock, InfHandle, FilePath);
807+
SetupLdrLoadNlsData(LoaderBlock1, InfHandle, FilePath);
797808

798809
/* Load the Firmware Errata file from the installation medium */
799-
Success = SetupLdrInitErrataInf(LoaderBlock, InfHandle, BootPath);
810+
Success = SetupLdrInitErrataInf(Extension2, InfHandle, BootPath);
800811
TRACE("Firmware Errata file %s\n", (Success ? "loaded" : "not loaded"));
801812
/* Not necessarily fatal if not found - carry on going */
802813

803814
// UiDrawStatusText("Press F6 if you need to install a 3rd-party SCSI or RAID driver...");
804815

805816
/* Get a list of boot drivers */
806-
SetupLdrScanBootDrivers(&LoaderBlock->BootDriverListHead, InfHandle, BootPath);
817+
SetupLdrScanBootDrivers(&LoaderBlock1->BootDriverListHead, InfHandle, BootPath);
807818

808819
/* Close the inf file */
809820
InfCloseFile(InfHandle);
@@ -813,6 +824,11 @@ LoadReactOSSetup(
813824
/* Finish loading */
814825
return LoadAndBootWindowsCommon(_WIN32_WINNT_WS03,
815826
LoaderBlock,
827+
LoaderBlock1,
828+
LoaderBlock2,
829+
SetupBlockPtr,
830+
Extension1,
831+
Extension2,
816832
BootOptions,
817833
BootPath);
818834
}

0 commit comments

Comments
 (0)