mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 20:43:25 +00:00
[FREELDR] Implement loading of rosload as 2nd stage loader
This commit is contained in:
parent
adacd51a30
commit
e56911f66b
6 changed files with 84 additions and 73 deletions
|
@ -58,11 +58,6 @@ list(APPEND FREELDR_BOOTLIB_SOURCE
|
||||||
|
|
||||||
list(APPEND FREELDR_BOOTMGR_SOURCE
|
list(APPEND FREELDR_BOOTMGR_SOURCE
|
||||||
include/freeldr.h
|
include/freeldr.h
|
||||||
custom.c
|
|
||||||
# linuxboot.c
|
|
||||||
miscboot.c
|
|
||||||
options.c
|
|
||||||
oslist.c
|
|
||||||
settings.c
|
settings.c
|
||||||
ui/directui.c
|
ui/directui.c
|
||||||
# ui/gui.c
|
# ui/gui.c
|
||||||
|
@ -88,10 +83,7 @@ if(ARCH STREQUAL "i386")
|
||||||
# arch/i386/linux.S
|
# arch/i386/linux.S
|
||||||
|
|
||||||
list(APPEND FREELDR_ARC_SOURCE
|
list(APPEND FREELDR_ARC_SOURCE
|
||||||
arch/i386/i386bug.c
|
arch/i386/i386bug.c)
|
||||||
arch/i386/halstub.c
|
|
||||||
arch/i386/ntoskrnl.c
|
|
||||||
disk/scsiport.c)
|
|
||||||
|
|
||||||
list(APPEND FREELDR_NTLDR_SOURCE
|
list(APPEND FREELDR_NTLDR_SOURCE
|
||||||
ntldr/arch/i386/winldr.c
|
ntldr/arch/i386/winldr.c
|
||||||
|
@ -118,17 +110,11 @@ else()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
list(APPEND FREELDR_BASE_SOURCE
|
list(APPEND FREELDR_BASE_SOURCE
|
||||||
bootmgr.c # This file is compiled with custom definitions
|
|
||||||
freeldr.c
|
freeldr.c
|
||||||
ntldr/setupldr.c ## Strangely enough this file is needed in GCC builds
|
ntldr/ntldropts.c # Should be in rosload, but is currently needed by machpc.c, etc.
|
||||||
## even if ${FREELDR_NTLDR_SOURCE} is not added,
|
|
||||||
## otherwise we get linking errors with Rtl**Bitmap** APIs.
|
|
||||||
## Do not happen on MSVC builds however...
|
|
||||||
ntldr/inffile.c
|
|
||||||
ntldr/ntldropts.c
|
|
||||||
lib/rtl/libsupp.c)
|
lib/rtl/libsupp.c)
|
||||||
|
|
||||||
if(ARCH STREQUAL "i386")
|
if(ARCH STREQUAL "i386" OR ARCH STREQUAL "amd64")
|
||||||
# Must be included together with disk/scsiport.c
|
# Must be included together with disk/scsiport.c
|
||||||
list(APPEND FREELDR_BASE_SOURCE
|
list(APPEND FREELDR_BASE_SOURCE
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/freeldr.def)
|
${CMAKE_CURRENT_BINARY_DIR}/freeldr.def)
|
||||||
|
|
|
@ -30,6 +30,64 @@ CCHAR FrLdrBootPath[MAX_PATH] = "";
|
||||||
|
|
||||||
/* FUNCTIONS ******************************************************************/
|
/* FUNCTIONS ******************************************************************/
|
||||||
|
|
||||||
|
static
|
||||||
|
BOOLEAN
|
||||||
|
LoadRosload(
|
||||||
|
_In_ PCSTR RosloadPath,
|
||||||
|
_Out_ PVOID* ImageBase,
|
||||||
|
_Out_ PLDR_DATA_TABLE_ENTRY* DataTableEntry)
|
||||||
|
{
|
||||||
|
CHAR FullPath[MAX_PATH];
|
||||||
|
BOOLEAN Success;
|
||||||
|
|
||||||
|
/* Create full rosload.exe path */
|
||||||
|
RtlStringCbPrintfA(FullPath,
|
||||||
|
sizeof(FullPath),
|
||||||
|
"%s\\%s",
|
||||||
|
FrLdrBootPath,
|
||||||
|
RosloadPath);
|
||||||
|
|
||||||
|
TRACE("Loading second stage loader '%s'\n", FullPath);
|
||||||
|
|
||||||
|
/* Load rosload.exe as a bootloader image. The base name is "scsiport.sys",
|
||||||
|
because it exports ScsiPort* functions for ntbootdd.sys */
|
||||||
|
Success = PeLdrLoadBootImage(FullPath,
|
||||||
|
"scsiport.sys",
|
||||||
|
ImageBase,
|
||||||
|
DataTableEntry);
|
||||||
|
if (!Success)
|
||||||
|
{
|
||||||
|
WARN("Failed to load second stage loader '%s'\n", FullPath);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
ULONG
|
||||||
|
LaunchSecondStageLoader(VOID)
|
||||||
|
{
|
||||||
|
PLDR_DATA_TABLE_ENTRY RosloadDTE;
|
||||||
|
PVOID ImageBase;
|
||||||
|
LONG (*EntryPoint)(VOID);
|
||||||
|
|
||||||
|
/* Load the second stage loader */
|
||||||
|
if (!LoadRosload("rosload.exe", &ImageBase, &RosloadDTE))
|
||||||
|
{
|
||||||
|
/* Try in loader directory */
|
||||||
|
if (!LoadRosload("loader\\rosload.exe", &ImageBase, &RosloadDTE))
|
||||||
|
{
|
||||||
|
return ENOENT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Call the entrypoint */
|
||||||
|
printf("Launching rosload.exe...\n");
|
||||||
|
EntryPoint = VaToPa(RosloadDTE->EntryPoint);
|
||||||
|
return (*EntryPoint)();
|
||||||
|
}
|
||||||
|
|
||||||
VOID __cdecl BootMain(IN PCCH CmdLine)
|
VOID __cdecl BootMain(IN PCCH CmdLine)
|
||||||
{
|
{
|
||||||
/* Load the default settings from the command-line */
|
/* Load the default settings from the command-line */
|
||||||
|
@ -77,7 +135,11 @@ VOID __cdecl BootMain(IN PCCH CmdLine)
|
||||||
goto Quit;
|
goto Quit;
|
||||||
}
|
}
|
||||||
|
|
||||||
RunLoader();
|
/* Launch second stage loader */
|
||||||
|
if (LaunchSecondStageLoader() != ESUCCESS)
|
||||||
|
{
|
||||||
|
UiMessageBoxCritical("Unable to load second stage loader.");
|
||||||
|
}
|
||||||
|
|
||||||
Quit:
|
Quit:
|
||||||
/* If we reach this point, something went wrong before, therefore reboot */
|
/* If we reach this point, something went wrong before, therefore reboot */
|
||||||
|
|
|
@ -1,50 +1,3 @@
|
||||||
@ stdcall RtlAssert(ptr ptr long ptr)
|
|
||||||
@ varargs -arch=i386 ScsiDebugPrint(long str)
|
|
||||||
@ stdcall -arch=i386 ScsiPortCompleteRequest(ptr long long long long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortConvertPhysicalAddressToUlong(long long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortConvertUlongToPhysicalAddress(long)
|
|
||||||
#@ stdcall -arch=x86_64 ScsiPortConvertUlongToPhysicalAddress(long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortFlushDma(ptr)
|
|
||||||
@ stdcall -arch=i386 ScsiPortFreeDeviceBase(ptr ptr)
|
|
||||||
@ stdcall -arch=i386 ScsiPortGetBusData(ptr long long long ptr long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortGetDeviceBase(ptr long long long long long long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortGetLogicalUnit(ptr long long long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortGetPhysicalAddress(ptr ptr ptr long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortGetSrb(ptr long long long long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortGetUncachedExtension(ptr ptr long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortGetVirtualAddress(ptr long long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortInitialize(ptr ptr ptr ptr)
|
|
||||||
@ stdcall -arch=i386 ScsiPortIoMapTransfer(ptr ptr long long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortLogError(ptr ptr long long long long long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortMoveMemory(ptr ptr long)
|
|
||||||
@ cdecl -arch=i386 ScsiPortNotification()
|
|
||||||
@ stdcall -arch=i386 ScsiPortReadPortBufferUchar(ptr ptr long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortReadPortBufferUshort(ptr ptr long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortReadPortBufferUlong(ptr ptr long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortReadPortUchar(ptr)
|
|
||||||
@ stdcall -arch=i386 ScsiPortReadPortUshort(ptr)
|
|
||||||
@ stdcall -arch=i386 ScsiPortReadPortUlong(ptr)
|
|
||||||
@ stdcall -arch=i386 ScsiPortReadRegisterBufferUchar(ptr ptr long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortReadRegisterBufferUshort(ptr ptr long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortReadRegisterBufferUlong(ptr ptr long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortReadRegisterUchar(ptr)
|
|
||||||
@ stdcall -arch=i386 ScsiPortReadRegisterUshort(ptr)
|
|
||||||
@ stdcall -arch=i386 ScsiPortReadRegisterUlong(ptr)
|
|
||||||
@ stdcall -arch=i386 ScsiPortSetBusDataByOffset(ptr long long long ptr long long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortStallExecution(long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortValidateRange(ptr long long long long long long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortWritePortBufferUchar(ptr ptr long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortWritePortBufferUshort(ptr ptr long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortWritePortBufferUlong(ptr ptr long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortWritePortUchar(ptr long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortWritePortUshort(ptr long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortWritePortUlong(ptr long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortWriteRegisterBufferUchar(ptr ptr long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortWriteRegisterBufferUshort(ptr ptr long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortWriteRegisterBufferUlong(ptr ptr long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortWriteRegisterUchar(ptr long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortWriteRegisterUshort(ptr long)
|
|
||||||
@ stdcall -arch=i386 ScsiPortWriteRegisterUlong(ptr long)
|
|
||||||
|
|
||||||
# ARC
|
# ARC
|
||||||
@ cdecl ArcClose()
|
@ cdecl ArcClose()
|
||||||
|
@ -164,6 +117,7 @@
|
||||||
@ cdecl RamDiskInitialize()
|
@ cdecl RamDiskInitialize()
|
||||||
@ cdecl Reboot()
|
@ cdecl Reboot()
|
||||||
@ cdecl Relocator16Boot()
|
@ cdecl Relocator16Boot()
|
||||||
|
@ stdcall RtlAssert(ptr ptr long ptr)
|
||||||
@ cdecl StallExecutionProcessor()
|
@ cdecl StallExecutionProcessor()
|
||||||
|
|
||||||
# Additional stuff for scsiport
|
# Additional stuff for scsiport
|
||||||
|
|
|
@ -528,10 +528,9 @@ PeLdrInitializeModuleList(VOID)
|
||||||
|
|
||||||
InitializeListHead(&FrLdrModuleList);
|
InitializeListHead(&FrLdrModuleList);
|
||||||
|
|
||||||
/* Allocate a data table entry for freeldr.sys.
|
/* Allocate a data table entry for freeldr.sys */
|
||||||
The base name is scsiport.sys for imports from ntbootdd.sys */
|
|
||||||
if (!PeLdrAllocateDataTableEntry(&FrLdrModuleList,
|
if (!PeLdrAllocateDataTableEntry(&FrLdrModuleList,
|
||||||
"scsiport.sys",
|
"freeldr.sys",
|
||||||
"freeldr.sys",
|
"freeldr.sys",
|
||||||
&__ImageBase,
|
&__ImageBase,
|
||||||
&FreeldrDTE))
|
&FreeldrDTE))
|
||||||
|
|
|
@ -155,7 +155,7 @@ add_library(freeldr_common
|
||||||
${PCATLDR_ARC_SOURCE}
|
${PCATLDR_ARC_SOURCE}
|
||||||
${FREELDR_BOOTLIB_SOURCE}
|
${FREELDR_BOOTLIB_SOURCE}
|
||||||
${PCATLDR_BOOTMGR_SOURCE}
|
${PCATLDR_BOOTMGR_SOURCE}
|
||||||
${FREELDR_NTLDR_SOURCE})
|
)
|
||||||
|
|
||||||
if(MSVC AND CMAKE_C_COMPILER_ID STREQUAL "Clang")
|
if(MSVC AND CMAKE_C_COMPILER_ID STREQUAL "Clang")
|
||||||
# We need to reduce the binary size
|
# We need to reduce the binary size
|
||||||
|
@ -170,7 +170,7 @@ set(PCH_SOURCE
|
||||||
${PCATLDR_ARC_SOURCE}
|
${PCATLDR_ARC_SOURCE}
|
||||||
${FREELDR_BOOTLIB_SOURCE}
|
${FREELDR_BOOTLIB_SOURCE}
|
||||||
${PCATLDR_BOOTMGR_SOURCE}
|
${PCATLDR_BOOTMGR_SOURCE}
|
||||||
${FREELDR_NTLDR_SOURCE})
|
)
|
||||||
|
|
||||||
add_pch(freeldr_common include/freeldr.h PCH_SOURCE)
|
add_pch(freeldr_common include/freeldr.h PCH_SOURCE)
|
||||||
add_dependencies(freeldr_common bugcodes asm xdk)
|
add_dependencies(freeldr_common bugcodes asm xdk)
|
||||||
|
@ -221,7 +221,7 @@ if(ARCH STREQUAL "i386")
|
||||||
target_link_libraries(freeldr_pe mini_hal)
|
target_link_libraries(freeldr_pe mini_hal)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
target_link_libraries(freeldr_pe freeldr_common cportlib blcmlib blrtl libcntpr)
|
target_link_libraries(freeldr_pe freeldr_common cportlib libcntpr blrtl)
|
||||||
|
|
||||||
# dynamic analysis switches
|
# dynamic analysis switches
|
||||||
if(STACK_PROTECTOR)
|
if(STACK_PROTECTOR)
|
||||||
|
|
|
@ -43,13 +43,20 @@ else()
|
||||||
#TBD
|
#TBD
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
list(APPEND UEFILDR_BOOTMGR_SOURCE
|
||||||
|
${FREELDR_BOOTMGR_SOURCE}
|
||||||
|
custom.c
|
||||||
|
options.c
|
||||||
|
oslist.c
|
||||||
|
)
|
||||||
|
|
||||||
add_asm_files(uefifreeldr_common_asm ${FREELDR_COMMON_ASM_SOURCE} ${UEFILDR_COMMON_ASM_SOURCE})
|
add_asm_files(uefifreeldr_common_asm ${FREELDR_COMMON_ASM_SOURCE} ${UEFILDR_COMMON_ASM_SOURCE})
|
||||||
|
|
||||||
add_library(uefifreeldr_common
|
add_library(uefifreeldr_common
|
||||||
${uefifreeldr_common_asm}
|
${uefifreeldr_common_asm}
|
||||||
${UEFILDR_ARC_SOURCE}
|
${UEFILDR_ARC_SOURCE}
|
||||||
${FREELDR_BOOTLIB_SOURCE}
|
${FREELDR_BOOTLIB_SOURCE}
|
||||||
${FREELDR_BOOTMGR_SOURCE}
|
${UEFILDR_BOOTMGR_SOURCE}
|
||||||
${FREELDR_NTLDR_SOURCE})
|
${FREELDR_NTLDR_SOURCE})
|
||||||
|
|
||||||
target_compile_definitions(uefifreeldr_common PRIVATE UEFIBOOT)
|
target_compile_definitions(uefifreeldr_common PRIVATE UEFIBOOT)
|
||||||
|
@ -62,7 +69,7 @@ endif()
|
||||||
set(PCH_SOURCE
|
set(PCH_SOURCE
|
||||||
${UEFILDR_ARC_SOURCE}
|
${UEFILDR_ARC_SOURCE}
|
||||||
${FREELDR_BOOTLIB_SOURCE}
|
${FREELDR_BOOTLIB_SOURCE}
|
||||||
${FREELDR_BOOTMGR_SOURCE}
|
${UEFILDR_BOOTMGR_SOURCE}
|
||||||
${FREELDR_NTLDR_SOURCE})
|
${FREELDR_NTLDR_SOURCE})
|
||||||
|
|
||||||
add_pch(uefifreeldr_common include/arch/uefi/uefildr.h PCH_SOURCE)
|
add_pch(uefifreeldr_common include/arch/uefi/uefildr.h PCH_SOURCE)
|
||||||
|
@ -79,6 +86,9 @@ spec2def(uefildr.exe freeldr.spec)
|
||||||
list(APPEND UEFILDR_BASE_SOURCE
|
list(APPEND UEFILDR_BASE_SOURCE
|
||||||
include/arch/uefi/uefildr.h
|
include/arch/uefi/uefildr.h
|
||||||
arch/uefi/uefildr.c
|
arch/uefi/uefildr.c
|
||||||
|
bootmgr.c
|
||||||
|
ntldr/setupldr.c
|
||||||
|
ntldr/inffile.c
|
||||||
${FREELDR_BASE_SOURCE})
|
${FREELDR_BASE_SOURCE})
|
||||||
|
|
||||||
if(ARCH STREQUAL "i386")
|
if(ARCH STREQUAL "i386")
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue