https://git.reactos.org/?p=reactos.git;a=commitdiff;h=f81c1910ee1cc29c01bca…
commit f81c1910ee1cc29c01bca03f0e52551eec647dba
Author: Timo Kreuzer <timo.kreuzer(a)reactos.org>
AuthorDate: Wed Oct 2 12:07:09 2024 +0200
Commit: Timo Kreuzer <timo.kreuzer(a)reactos.org>
CommitDate: Tue Feb 4 16:45:48 2025 +0200
[FREELDR] Export functions for a 2nd stage loader
---
boot/freeldr/freeldr/CMakeLists.txt | 2 +-
boot/freeldr/freeldr/freeldr.spec | 227 +++++++++++++++++++++++++++-------
boot/freeldr/freeldr/lib/debug.c | 34 +++++
boot/freeldr/freeldr/lib/mm/meminit.c | 8 ++
boot/freeldr/freeldr/pcat.cmake | 2 +-
5 files changed, 226 insertions(+), 47 deletions(-)
diff --git a/boot/freeldr/freeldr/CMakeLists.txt b/boot/freeldr/freeldr/CMakeLists.txt
index b97b15a1763..2a349833b07 100644
--- a/boot/freeldr/freeldr/CMakeLists.txt
+++ b/boot/freeldr/freeldr/CMakeLists.txt
@@ -131,7 +131,7 @@ list(APPEND FREELDR_BASE_SOURCE
if(ARCH STREQUAL "i386")
# Must be included together with disk/scsiport.c
list(APPEND FREELDR_BASE_SOURCE
- ${CMAKE_CURRENT_BINARY_DIR}/freeldr_pe.def)
+ ${CMAKE_CURRENT_BINARY_DIR}/freeldr.def)
endif()
include(pcat.cmake)
diff --git a/boot/freeldr/freeldr/freeldr.spec b/boot/freeldr/freeldr/freeldr.spec
index 3ffd70aac37..2ea08b1927c 100644
--- a/boot/freeldr/freeldr/freeldr.spec
+++ b/boot/freeldr/freeldr/freeldr.spec
@@ -1,47 +1,184 @@
@ stdcall RtlAssert(ptr ptr long ptr)
-@ varargs ScsiDebugPrint(long str)
-@ stdcall ScsiPortCompleteRequest(ptr long long long long)
-@ stdcall ScsiPortConvertPhysicalAddressToUlong(long long)
+@ 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 ScsiPortFlushDma(ptr)
-@ stdcall ScsiPortFreeDeviceBase(ptr ptr)
-@ stdcall ScsiPortGetBusData(ptr long long long ptr long)
-@ stdcall ScsiPortGetDeviceBase(ptr long long long long long long)
-@ stdcall ScsiPortGetLogicalUnit(ptr long long long)
-@ stdcall ScsiPortGetPhysicalAddress(ptr ptr ptr long)
-@ stdcall ScsiPortGetSrb(ptr long long long long)
-@ stdcall ScsiPortGetUncachedExtension(ptr ptr long)
-@ stdcall ScsiPortGetVirtualAddress(ptr long long)
-@ stdcall ScsiPortInitialize(ptr ptr ptr ptr)
-@ stdcall ScsiPortIoMapTransfer(ptr ptr long long)
-@ stdcall ScsiPortLogError(ptr ptr long long long long long)
-@ stdcall ScsiPortMoveMemory(ptr ptr long)
-@ cdecl ScsiPortNotification()
-@ stdcall ScsiPortReadPortBufferUchar(ptr ptr long)
-@ stdcall ScsiPortReadPortBufferUshort(ptr ptr long)
-@ stdcall ScsiPortReadPortBufferUlong(ptr ptr long)
-@ stdcall ScsiPortReadPortUchar(ptr)
-@ stdcall ScsiPortReadPortUshort(ptr)
-@ stdcall ScsiPortReadPortUlong(ptr)
-@ stdcall ScsiPortReadRegisterBufferUchar(ptr ptr long)
-@ stdcall ScsiPortReadRegisterBufferUshort(ptr ptr long)
-@ stdcall ScsiPortReadRegisterBufferUlong(ptr ptr long)
-@ stdcall ScsiPortReadRegisterUchar(ptr)
-@ stdcall ScsiPortReadRegisterUshort(ptr)
-@ stdcall ScsiPortReadRegisterUlong(ptr)
-@ stdcall ScsiPortSetBusDataByOffset(ptr long long long ptr long long)
-@ stdcall ScsiPortStallExecution(long)
-@ stdcall ScsiPortValidateRange(ptr long long long long long long)
-@ stdcall ScsiPortWritePortBufferUchar(ptr ptr long)
-@ stdcall ScsiPortWritePortBufferUshort(ptr ptr long)
-@ stdcall ScsiPortWritePortBufferUlong(ptr ptr long)
-@ stdcall ScsiPortWritePortUchar(ptr long)
-@ stdcall ScsiPortWritePortUshort(ptr long)
-@ stdcall ScsiPortWritePortUlong(ptr long)
-@ stdcall ScsiPortWriteRegisterBufferUchar(ptr ptr long)
-@ stdcall ScsiPortWriteRegisterBufferUshort(ptr ptr long)
-@ stdcall ScsiPortWriteRegisterBufferUlong(ptr ptr long)
-@ stdcall ScsiPortWriteRegisterUchar(ptr long)
-@ stdcall ScsiPortWriteRegisterUshort(ptr long)
-@ stdcall ScsiPortWriteRegisterUlong(ptr 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
+@ cdecl ArcClose()
+@ cdecl ArcGetDiskCount()
+@ cdecl ArcGetDiskInfo()
+@ cdecl ArcGetFileInformation()
+@ cdecl ArcGetTime()
+@ cdecl ArcOpen()
+@ cdecl ArcRead()
+@ cdecl ArcSeek()
+
+# Debug
+@ cdecl DbgParseDebugChannels()
+@ cdecl DbgPrint(str)
+@ cdecl DbgPrint2(long long str long str)
+@ cdecl DebugDumpBuffer()
+@ cdecl DebugInit()
+@ cdecl FrLdrBugCheckWithMessage()
+@ stdcall KeBugCheckEx(long long long long long)
+
+# Heap
+@ cdecl FrLdrHeapAllocateEx()
+@ cdecl FrLdrHeapFreeEx()
+@ cdecl FrLdrHeapAlloc()
+@ cdecl FrLdrHeapFree()
+@ cdecl FrLdrTempAlloc()
+@ cdecl FrLdrTempFree()
+@ cdecl FrLdrHeapCleanupAll()
+
+# INI (check if we can move this to rosload)
+@ cdecl IniAddSection()
+@ cdecl IniAddSettingValueToSection()
+@ cdecl IniCleanup()
+@ cdecl IniGetFileSectionListHead()
+@ cdecl IniGetNumSectionItems()
+@ cdecl IniGetSectionSettingNameSize()
+@ cdecl IniGetSectionSettingValueSize()
+@ cdecl IniFileInitialize()
+@ cdecl IniModifySettingValue()
+@ cdecl IniOpenSection()
+@ cdecl IniReadSettingByName()
+@ cdecl IniReadSettingByNumber()
+
+# Mm
+@ cdecl AddMemoryDescriptor()
+@ cdecl MmAllocateHighestMemoryBelowAddress()
+@ cdecl MmAllocateMemoryAtAddress()
+@ cdecl MmAllocateMemoryWithType()
+@ cdecl MmFreeMemory()
+@ cdecl MmGetBiosMemoryMap()
+@ cdecl MmGetHighestPhysicalPage()
+@ cdecl MmGetLoaderPagesSpanned()
+@ cdecl MmGetMemoryMap()
+@ cdecl MmGetSystemMemoryMapTypeString()
+@ cdecl MmGetTotalPagesInLookupTable()
+
+# NtLdr options
+@ cdecl NtLdrGetNextOption()
+@ cdecl NtLdrGetOption()
+@ cdecl NtLdrGetOptionEx()
+@ cdecl NtLdrGetOptionExN()
+@ cdecl NtLdrAddOptions()
+
+# PeLdr
+@ cdecl PeLdrAllocateDataTableEntry()
+@ cdecl PeLdrCheckForLoadedDll()
+@ cdecl PeLdrFreeDataTableEntry()
+@ cdecl PeLdrImportDllLoadCallback()
+@ cdecl PeLdrInitSecurityCookie()
+@ cdecl PeLdrLoadBootImage()
+@ cdecl PeLdrLoadImage()
+@ cdecl PeLdrLoadImageEx()
+@ cdecl PeLdrScanImportDescriptorTable()
+
+# UI
+@ cdecl UiDisplayMenu()
+@ cdecl UiDrawBackdrop()
+@ cdecl UiDrawProgressBarCenter()
+@ cdecl UiDrawStatusText()
+@ cdecl UiDrawText()
+@ cdecl UiEditBox()
+@ cdecl UiGetMenuBgColor()
+@ cdecl UiGetScreenHeight()
+@ cdecl UiIndicateProgress()
+@ cdecl UiInitialize()
+@ cdecl UiMessageBox()
+@ cdecl UiMessageBoxCritical()
+@ cdecl UiResetForSOS()
+@ cdecl UiSetProgressBarSubset()
+@ cdecl UiSetProgressBarText()
+@ cdecl UiShowMessageBoxesInArgv()
+@ cdecl UiShowMessageBoxesInSection()
+@ cdecl UiUnInitialize()
+@ cdecl UiUpdateProgressBar()
+@ cdecl TuiPrintf()
+
+# Other
+@ cdecl ChainLoadBiosBootSectorCode()
+@ cdecl ConstructArcPath()
+@ cdecl DissectArcPath()
+@ cdecl DiskStopFloppyMotor()
+@ cdecl DriveMapGetBiosDriveNumber()
+@ cdecl FrldrGetBootDrive()
+@ cdecl FrldrGetBootPartition()
+@ cdecl FrLdrGetBootPath()
+@ cdecl FsGetServiceName()
+@ cdecl FsOpenFile() # Why not ArcOpen?
+@ cdecl GetArgumentValue()
+@ cdecl GetBootMgrInfo()
+@ cdecl IsAcpiPresent()
+@ cdecl LoadSettings()
+@ cdecl MachHwDetect()
+@ cdecl MachPrepareForReactOS()
+@ cdecl MachGetExtendedBIOSData()
+@ cdecl MachVideoGetFontsFromFirmware()
+@ cdecl PxeCallApi()
+@ cdecl RamDiskInitialize()
+@ cdecl Reboot()
+@ cdecl Relocator16Boot()
+@ cdecl StallExecutionProcessor()
+
+# Additional stuff for scsiport
+@ stdcall CpDoesPortExist(ptr)
+@ stdcall CpEnableFifo(ptr long)
+@ stdcall CpGetByte(ptr ptr long long)
+@ stdcall CpInitialize(ptr ptr long)
+@ stdcall CpPutByte(ptr long)
+@ cdecl DissectArcPath2()
+@ cdecl -i386 DriveMapMapDrivesInSection()
+@ cdecl FsRegisterDevice()
+@ cdecl FsGetDeviceSpecific()
+@ cdecl FsSetDeviceSpecific()
+@ stdcall ExAllocatePool(long long)
+@ stdcall ExAllocatePoolWithTag(long long long)
+@ stdcall ExFreePool(ptr)
+@ stdcall ExFreePoolWithTag(ptr long)
+@ cdecl MmSetMemoryType()
diff --git a/boot/freeldr/freeldr/lib/debug.c b/boot/freeldr/freeldr/lib/debug.c
index c1f9d954cd3..efb059e2740 100644
--- a/boot/freeldr/freeldr/lib/debug.c
+++ b/boot/freeldr/freeldr/lib/debug.c
@@ -424,12 +424,46 @@ DbgParseDebugChannels(PCHAR Value)
#else
+#undef DebugInit
+VOID
+DebugInit(
+ _In_ PCSTR DebugString)
+{
+ UNREFERENCED_PARAMETER(DebugString);
+}
+
ULONG
DbgPrint(PCCH Format, ...)
{
+ UNREFERENCED_PARAMETER(Format);
return 0;
}
+VOID
+DbgPrint2(ULONG Mask, ULONG Level, const char *File, ULONG Line, char *Format, ...)
+{
+ UNREFERENCED_PARAMETER(Mask);
+ UNREFERENCED_PARAMETER(Level);
+ UNREFERENCED_PARAMETER(File);
+ UNREFERENCED_PARAMETER(Line);
+ UNREFERENCED_PARAMETER(Format);
+}
+
+VOID
+DebugDumpBuffer(ULONG Mask, PVOID Buffer, ULONG Length)
+{
+ UNREFERENCED_PARAMETER(Mask);
+ UNREFERENCED_PARAMETER(Buffer);
+ UNREFERENCED_PARAMETER(Length);
+}
+
+#undef DbgParseDebugChannels
+VOID
+DbgParseDebugChannels(PCHAR Value)
+{
+ UNREFERENCED_PARAMETER(Value);
+}
+
#endif // DBG
ULONG
diff --git a/boot/freeldr/freeldr/lib/mm/meminit.c
b/boot/freeldr/freeldr/lib/mm/meminit.c
index fe3d29ebb12..b3b8ac3171e 100644
--- a/boot/freeldr/freeldr/lib/mm/meminit.c
+++ b/boot/freeldr/freeldr/lib/mm/meminit.c
@@ -109,6 +109,14 @@ DbgDumpMemoryMap(
}
DbgPrint("\n");
}
+#else
+/* Dummy, so we can export it */
+PCSTR
+MmGetSystemMemoryMapTypeString(
+ TYPE_OF_MEMORY Type)
+{
+ return "-";
+}
#endif
ULONG
diff --git a/boot/freeldr/freeldr/pcat.cmake b/boot/freeldr/freeldr/pcat.cmake
index 020ae7e018a..02c85cf7110 100644
--- a/boot/freeldr/freeldr/pcat.cmake
+++ b/boot/freeldr/freeldr/pcat.cmake
@@ -22,7 +22,7 @@ elseif(ARCH STREQUAL "amd64")
endif()
-spec2def(freeldr_pe.exe freeldr.spec)
+spec2def(freeldr.sys freeldr.spec ADD_IMPORTLIB)
list(APPEND PCATLDR_ARC_SOURCE
${FREELDR_ARC_SOURCE}