diff --git a/Source/Windows/ARM64EC/Module.cpp b/Source/Windows/ARM64EC/Module.cpp index 21118a4d8..7319506b9 100644 --- a/Source/Windows/ARM64EC/Module.cpp +++ b/Source/Windows/ARM64EC/Module.cpp @@ -24,12 +24,14 @@ $end_info$ #include #include +#include "Common/ArgumentLoader.h" #include "Common/Config.h" #include "Common/Exception.h" #include "Common/InvalidationTracker.h" #include "Common/TSOHandlerConfig.h" #include "Common/CPUFeatures.h" #include "Common/Logging.h" +#include "Common/Module.h" #include "Common/CRT/CRT.h" #include "DummyHandlers.h" #include "BTInterface.h" @@ -456,11 +458,7 @@ extern "C" void SyncThreadContext(CONTEXT* Context) { NTSTATUS ProcessInit() { FEX::Windows::InitCRTProcess(); - FEX::Config::InitializeConfigs(FEX::Config::PortableInformation {}); - FEXCore::Config::Initialize(); - FEXCore::Config::AddLayer(FEX::Config::CreateGlobalMainLayer()); - FEXCore::Config::AddLayer(FEX::Config::CreateMainLayer()); - FEXCore::Config::Load(); + FEX::Config::LoadConfig(nullptr, FEX::Windows::GetExecutableFilePath()); FEXCore::Config::ReloadMetaLayer(); FEX::Windows::Logging::Init(); diff --git a/Source/Windows/Common/Module.h b/Source/Windows/Common/Module.h new file mode 100644 index 000000000..de5a44252 --- /dev/null +++ b/Source/Windows/Common/Module.h @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +#pragma once + +#include +#include +#include + +namespace FEX::Windows { +fextl::string GetExecutableFilePath() { + std::array Buf; + UNICODE_STRING PathW {.Length = 0, .MaximumLength = Buf.size() * sizeof(WCHAR), .Buffer = Buf.data()}; + + if (LdrGetDllFullName(nullptr, &PathW)) { + return {}; + } + + STRING PathA; + RtlUnicodeStringToAnsiString(&PathA, &PathW, TRUE); + fextl::string Path(PathA.Buffer); + RtlFreeAnsiString(&PathA); + + return Path.substr(Path.find_last_of('\\') + 1); +} +} // namespace FEX::Windows diff --git a/Source/Windows/WOW64/Module.cpp b/Source/Windows/WOW64/Module.cpp index ace687946..bfb53fdb4 100644 --- a/Source/Windows/WOW64/Module.cpp +++ b/Source/Windows/WOW64/Module.cpp @@ -25,12 +25,14 @@ $end_info$ #include #include +#include "Common/ArgumentLoader.h" #include "Common/Config.h" #include "Common/Exception.h" #include "Common/TSOHandlerConfig.h" #include "Common/InvalidationTracker.h" #include "Common/CPUFeatures.h" #include "Common/Logging.h" +#include "Common/Module.h" #include "Common/CRT/CRT.h" #include "DummyHandlers.h" #include "BTInterface.h" @@ -424,11 +426,7 @@ public: void BTCpuProcessInit() { FEX::Windows::InitCRTProcess(); - FEX::Config::InitializeConfigs(FEX::Config::PortableInformation {}); - FEXCore::Config::Initialize(); - FEXCore::Config::AddLayer(FEX::Config::CreateGlobalMainLayer()); - FEXCore::Config::AddLayer(FEX::Config::CreateMainLayer()); - FEXCore::Config::Load(); + FEX::Config::LoadConfig(nullptr, FEX::Windows::GetExecutableFilePath()); FEXCore::Config::ReloadMetaLayer(); FEX::Windows::Logging::Init(); diff --git a/Source/Windows/include/winternl.h b/Source/Windows/include/winternl.h index d9dca52f9..81c938006 100644 --- a/Source/Windows/include/winternl.h +++ b/Source/Windows/include/winternl.h @@ -433,6 +433,7 @@ typedef struct _KEY_VALUE_PARTIAL_INFORMATION { NTSTATUS WINAPIV DbgPrint(LPCSTR fmt, ...); NTSTATUS WINAPI LdrDisableThreadCalloutsForDll(HMODULE); +NTSTATUS WINAPI LdrGetDllFullName(HMODULE, UNICODE_STRING*); NTSTATUS WINAPI LdrGetDllHandle(LPCWSTR, ULONG, const UNICODE_STRING*, HMODULE*); NTSTATUS WINAPI LdrGetProcedureAddress(HMODULE, const ANSI_STRING*, ULONG, void**); NTSTATUS WINAPI NtAllocateVirtualMemoryEx(HANDLE, PVOID*, SIZE_T*, ULONG, ULONG, MEM_EXTENDED_PARAMETER*, ULONG);