Skip to content

Commit e56911f

Browse files
committed
[FREELDR] Implement loading of rosload as 2nd stage loader
1 parent adacd51 commit e56911f

File tree

6 files changed

+84
-73
lines changed

6 files changed

+84
-73
lines changed

boot/freeldr/freeldr/CMakeLists.txt

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,6 @@ list(APPEND FREELDR_BOOTLIB_SOURCE
5858

5959
list(APPEND FREELDR_BOOTMGR_SOURCE
6060
include/freeldr.h
61-
custom.c
62-
# linuxboot.c
63-
miscboot.c
64-
options.c
65-
oslist.c
6661
settings.c
6762
ui/directui.c
6863
# ui/gui.c
@@ -88,10 +83,7 @@ if(ARCH STREQUAL "i386")
8883
# arch/i386/linux.S
8984

9085
list(APPEND FREELDR_ARC_SOURCE
91-
arch/i386/i386bug.c
92-
arch/i386/halstub.c
93-
arch/i386/ntoskrnl.c
94-
disk/scsiport.c)
86+
arch/i386/i386bug.c)
9587

9688
list(APPEND FREELDR_NTLDR_SOURCE
9789
ntldr/arch/i386/winldr.c
@@ -118,17 +110,11 @@ else()
118110
endif()
119111

120112
list(APPEND FREELDR_BASE_SOURCE
121-
bootmgr.c # This file is compiled with custom definitions
122113
freeldr.c
123-
ntldr/setupldr.c ## Strangely enough this file is needed in GCC builds
124-
## even if ${FREELDR_NTLDR_SOURCE} is not added,
125-
## otherwise we get linking errors with Rtl**Bitmap** APIs.
126-
## Do not happen on MSVC builds however...
127-
ntldr/inffile.c
128-
ntldr/ntldropts.c
114+
ntldr/ntldropts.c # Should be in rosload, but is currently needed by machpc.c, etc.
129115
lib/rtl/libsupp.c)
130116

131-
if(ARCH STREQUAL "i386")
117+
if(ARCH STREQUAL "i386" OR ARCH STREQUAL "amd64")
132118
# Must be included together with disk/scsiport.c
133119
list(APPEND FREELDR_BASE_SOURCE
134120
${CMAKE_CURRENT_BINARY_DIR}/freeldr.def)

boot/freeldr/freeldr/freeldr.c

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,64 @@ CCHAR FrLdrBootPath[MAX_PATH] = "";
3030

3131
/* FUNCTIONS ******************************************************************/
3232

33+
static
34+
BOOLEAN
35+
LoadRosload(
36+
_In_ PCSTR RosloadPath,
37+
_Out_ PVOID* ImageBase,
38+
_Out_ PLDR_DATA_TABLE_ENTRY* DataTableEntry)
39+
{
40+
CHAR FullPath[MAX_PATH];
41+
BOOLEAN Success;
42+
43+
/* Create full rosload.exe path */
44+
RtlStringCbPrintfA(FullPath,
45+
sizeof(FullPath),
46+
"%s\\%s",
47+
FrLdrBootPath,
48+
RosloadPath);
49+
50+
TRACE("Loading second stage loader '%s'\n", FullPath);
51+
52+
/* Load rosload.exe as a bootloader image. The base name is "scsiport.sys",
53+
because it exports ScsiPort* functions for ntbootdd.sys */
54+
Success = PeLdrLoadBootImage(FullPath,
55+
"scsiport.sys",
56+
ImageBase,
57+
DataTableEntry);
58+
if (!Success)
59+
{
60+
WARN("Failed to load second stage loader '%s'\n", FullPath);
61+
return FALSE;
62+
}
63+
64+
return TRUE;
65+
}
66+
67+
static
68+
ULONG
69+
LaunchSecondStageLoader(VOID)
70+
{
71+
PLDR_DATA_TABLE_ENTRY RosloadDTE;
72+
PVOID ImageBase;
73+
LONG (*EntryPoint)(VOID);
74+
75+
/* Load the second stage loader */
76+
if (!LoadRosload("rosload.exe", &ImageBase, &RosloadDTE))
77+
{
78+
/* Try in loader directory */
79+
if (!LoadRosload("loader\\rosload.exe", &ImageBase, &RosloadDTE))
80+
{
81+
return ENOENT;
82+
}
83+
}
84+
85+
/* Call the entrypoint */
86+
printf("Launching rosload.exe...\n");
87+
EntryPoint = VaToPa(RosloadDTE->EntryPoint);
88+
return (*EntryPoint)();
89+
}
90+
3391
VOID __cdecl BootMain(IN PCCH CmdLine)
3492
{
3593
/* Load the default settings from the command-line */
@@ -77,7 +135,11 @@ VOID __cdecl BootMain(IN PCCH CmdLine)
77135
goto Quit;
78136
}
79137

80-
RunLoader();
138+
/* Launch second stage loader */
139+
if (LaunchSecondStageLoader() != ESUCCESS)
140+
{
141+
UiMessageBoxCritical("Unable to load second stage loader.");
142+
}
81143

82144
Quit:
83145
/* If we reach this point, something went wrong before, therefore reboot */

boot/freeldr/freeldr/freeldr.spec

Lines changed: 1 addition & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,3 @@
1-
@ stdcall RtlAssert(ptr ptr long ptr)
2-
@ varargs -arch=i386 ScsiDebugPrint(long str)
3-
@ stdcall -arch=i386 ScsiPortCompleteRequest(ptr long long long long)
4-
@ stdcall -arch=i386 ScsiPortConvertPhysicalAddressToUlong(long long)
5-
@ stdcall -arch=i386 ScsiPortConvertUlongToPhysicalAddress(long)
6-
#@ stdcall -arch=x86_64 ScsiPortConvertUlongToPhysicalAddress(long)
7-
@ stdcall -arch=i386 ScsiPortFlushDma(ptr)
8-
@ stdcall -arch=i386 ScsiPortFreeDeviceBase(ptr ptr)
9-
@ stdcall -arch=i386 ScsiPortGetBusData(ptr long long long ptr long)
10-
@ stdcall -arch=i386 ScsiPortGetDeviceBase(ptr long long long long long long)
11-
@ stdcall -arch=i386 ScsiPortGetLogicalUnit(ptr long long long)
12-
@ stdcall -arch=i386 ScsiPortGetPhysicalAddress(ptr ptr ptr long)
13-
@ stdcall -arch=i386 ScsiPortGetSrb(ptr long long long long)
14-
@ stdcall -arch=i386 ScsiPortGetUncachedExtension(ptr ptr long)
15-
@ stdcall -arch=i386 ScsiPortGetVirtualAddress(ptr long long)
16-
@ stdcall -arch=i386 ScsiPortInitialize(ptr ptr ptr ptr)
17-
@ stdcall -arch=i386 ScsiPortIoMapTransfer(ptr ptr long long)
18-
@ stdcall -arch=i386 ScsiPortLogError(ptr ptr long long long long long)
19-
@ stdcall -arch=i386 ScsiPortMoveMemory(ptr ptr long)
20-
@ cdecl -arch=i386 ScsiPortNotification()
21-
@ stdcall -arch=i386 ScsiPortReadPortBufferUchar(ptr ptr long)
22-
@ stdcall -arch=i386 ScsiPortReadPortBufferUshort(ptr ptr long)
23-
@ stdcall -arch=i386 ScsiPortReadPortBufferUlong(ptr ptr long)
24-
@ stdcall -arch=i386 ScsiPortReadPortUchar(ptr)
25-
@ stdcall -arch=i386 ScsiPortReadPortUshort(ptr)
26-
@ stdcall -arch=i386 ScsiPortReadPortUlong(ptr)
27-
@ stdcall -arch=i386 ScsiPortReadRegisterBufferUchar(ptr ptr long)
28-
@ stdcall -arch=i386 ScsiPortReadRegisterBufferUshort(ptr ptr long)
29-
@ stdcall -arch=i386 ScsiPortReadRegisterBufferUlong(ptr ptr long)
30-
@ stdcall -arch=i386 ScsiPortReadRegisterUchar(ptr)
31-
@ stdcall -arch=i386 ScsiPortReadRegisterUshort(ptr)
32-
@ stdcall -arch=i386 ScsiPortReadRegisterUlong(ptr)
33-
@ stdcall -arch=i386 ScsiPortSetBusDataByOffset(ptr long long long ptr long long)
34-
@ stdcall -arch=i386 ScsiPortStallExecution(long)
35-
@ stdcall -arch=i386 ScsiPortValidateRange(ptr long long long long long long)
36-
@ stdcall -arch=i386 ScsiPortWritePortBufferUchar(ptr ptr long)
37-
@ stdcall -arch=i386 ScsiPortWritePortBufferUshort(ptr ptr long)
38-
@ stdcall -arch=i386 ScsiPortWritePortBufferUlong(ptr ptr long)
39-
@ stdcall -arch=i386 ScsiPortWritePortUchar(ptr long)
40-
@ stdcall -arch=i386 ScsiPortWritePortUshort(ptr long)
41-
@ stdcall -arch=i386 ScsiPortWritePortUlong(ptr long)
42-
@ stdcall -arch=i386 ScsiPortWriteRegisterBufferUchar(ptr ptr long)
43-
@ stdcall -arch=i386 ScsiPortWriteRegisterBufferUshort(ptr ptr long)
44-
@ stdcall -arch=i386 ScsiPortWriteRegisterBufferUlong(ptr ptr long)
45-
@ stdcall -arch=i386 ScsiPortWriteRegisterUchar(ptr long)
46-
@ stdcall -arch=i386 ScsiPortWriteRegisterUshort(ptr long)
47-
@ stdcall -arch=i386 ScsiPortWriteRegisterUlong(ptr long)
481

492
# ARC
503
@ cdecl ArcClose()
@@ -164,6 +117,7 @@
164117
@ cdecl RamDiskInitialize()
165118
@ cdecl Reboot()
166119
@ cdecl Relocator16Boot()
120+
@ stdcall RtlAssert(ptr ptr long ptr)
167121
@ cdecl StallExecutionProcessor()
168122

169123
# Additional stuff for scsiport

boot/freeldr/freeldr/lib/peloader.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -528,10 +528,9 @@ PeLdrInitializeModuleList(VOID)
528528

529529
InitializeListHead(&FrLdrModuleList);
530530

531-
/* Allocate a data table entry for freeldr.sys.
532-
The base name is scsiport.sys for imports from ntbootdd.sys */
531+
/* Allocate a data table entry for freeldr.sys */
533532
if (!PeLdrAllocateDataTableEntry(&FrLdrModuleList,
534-
"scsiport.sys",
533+
"freeldr.sys",
535534
"freeldr.sys",
536535
&__ImageBase,
537536
&FreeldrDTE))

boot/freeldr/freeldr/pcat.cmake

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ add_library(freeldr_common
155155
${PCATLDR_ARC_SOURCE}
156156
${FREELDR_BOOTLIB_SOURCE}
157157
${PCATLDR_BOOTMGR_SOURCE}
158-
${FREELDR_NTLDR_SOURCE})
158+
)
159159

160160
if(MSVC AND CMAKE_C_COMPILER_ID STREQUAL "Clang")
161161
# We need to reduce the binary size
@@ -170,7 +170,7 @@ set(PCH_SOURCE
170170
${PCATLDR_ARC_SOURCE}
171171
${FREELDR_BOOTLIB_SOURCE}
172172
${PCATLDR_BOOTMGR_SOURCE}
173-
${FREELDR_NTLDR_SOURCE})
173+
)
174174

175175
add_pch(freeldr_common include/freeldr.h PCH_SOURCE)
176176
add_dependencies(freeldr_common bugcodes asm xdk)
@@ -221,7 +221,7 @@ if(ARCH STREQUAL "i386")
221221
target_link_libraries(freeldr_pe mini_hal)
222222
endif()
223223

224-
target_link_libraries(freeldr_pe freeldr_common cportlib blcmlib blrtl libcntpr)
224+
target_link_libraries(freeldr_pe freeldr_common cportlib libcntpr blrtl)
225225

226226
# dynamic analysis switches
227227
if(STACK_PROTECTOR)

boot/freeldr/freeldr/uefi.cmake

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,20 @@ else()
4343
#TBD
4444
endif()
4545

46+
list(APPEND UEFILDR_BOOTMGR_SOURCE
47+
${FREELDR_BOOTMGR_SOURCE}
48+
custom.c
49+
options.c
50+
oslist.c
51+
)
52+
4653
add_asm_files(uefifreeldr_common_asm ${FREELDR_COMMON_ASM_SOURCE} ${UEFILDR_COMMON_ASM_SOURCE})
4754

4855
add_library(uefifreeldr_common
4956
${uefifreeldr_common_asm}
5057
${UEFILDR_ARC_SOURCE}
5158
${FREELDR_BOOTLIB_SOURCE}
52-
${FREELDR_BOOTMGR_SOURCE}
59+
${UEFILDR_BOOTMGR_SOURCE}
5360
${FREELDR_NTLDR_SOURCE})
5461

5562
target_compile_definitions(uefifreeldr_common PRIVATE UEFIBOOT)
@@ -62,7 +69,7 @@ endif()
6269
set(PCH_SOURCE
6370
${UEFILDR_ARC_SOURCE}
6471
${FREELDR_BOOTLIB_SOURCE}
65-
${FREELDR_BOOTMGR_SOURCE}
72+
${UEFILDR_BOOTMGR_SOURCE}
6673
${FREELDR_NTLDR_SOURCE})
6774

6875
add_pch(uefifreeldr_common include/arch/uefi/uefildr.h PCH_SOURCE)
@@ -79,6 +86,9 @@ spec2def(uefildr.exe freeldr.spec)
7986
list(APPEND UEFILDR_BASE_SOURCE
8087
include/arch/uefi/uefildr.h
8188
arch/uefi/uefildr.c
89+
bootmgr.c
90+
ntldr/setupldr.c
91+
ntldr/inffile.c
8292
${FREELDR_BASE_SOURCE})
8393

8494
if(ARCH STREQUAL "i386")

0 commit comments

Comments
 (0)