Skip to content

Commit 13452f8

Browse files
committed
[FREELDR] Implement loading of rosload as 2nd stage loader
1 parent c982235 commit 13452f8

File tree

6 files changed

+82
-73
lines changed

6 files changed

+82
-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: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,62 @@ 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+
strcpy(FullPath, FrLdrBootPath);
45+
strcat(FullPath, "\\");
46+
strcat(FullPath, RosloadPath);
47+
48+
TRACE("Loading second stage loader '%s'\n", FullPath);
49+
50+
/* Load rosload.exe as a bootloader image. The base name is "scsiport.sys",
51+
because it exports ScsiPort* functions for ntbootdd.sys */
52+
Success = PeLdrLoadBootImage(FullPath,
53+
"scsiport.sys",
54+
ImageBase,
55+
DataTableEntry);
56+
if (!Success)
57+
{
58+
WARN("Failed to load second stage loader '%s'\n", FullPath);
59+
return FALSE;
60+
}
61+
62+
return TRUE;
63+
}
64+
65+
static
66+
ULONG
67+
LaunchSecondStageLoader(VOID)
68+
{
69+
PLDR_DATA_TABLE_ENTRY RosloadDTE;
70+
PVOID ImageBase;
71+
LONG (*EntryPoint)(VOID);
72+
73+
/* Load the second stage loader */
74+
if (!LoadRosload("rosload.exe", &ImageBase, &RosloadDTE))
75+
{
76+
/* Try in loader directory */
77+
if (!LoadRosload("loader\\rosload.exe", &ImageBase, &RosloadDTE))
78+
{
79+
return ENOENT;
80+
}
81+
}
82+
83+
/* Call the entrypoint */
84+
printf("Launching rosload.exe...\n");
85+
EntryPoint = VaToPa(RosloadDTE->EntryPoint);
86+
return (*EntryPoint)();
87+
}
88+
3389
VOID __cdecl BootMain(IN PCCH CmdLine)
3490
{
3591
/* Load the default settings from the command-line */
@@ -77,7 +133,11 @@ VOID __cdecl BootMain(IN PCCH CmdLine)
77133
goto Quit;
78134
}
79135

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

82142
Quit:
83143
/* 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
@@ -527,10 +527,9 @@ PeLdrInitializeModuleList(VOID)
527527

528528
InitializeListHead(&FrLdrModuleList);
529529

530-
/* Allocate a data table entry for freeldr.sys.
531-
The base name is scsiport.sys for imports from ntbootdd.sys */
530+
/* Allocate a data table entry for freeldr.sys */
532531
if (!PeLdrAllocateDataTableEntry(&FrLdrModuleList,
533-
"scsiport.sys",
532+
"freeldr.sys",
534533
"freeldr.sys",
535534
&__ImageBase,
536535
&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)