From 675d8d88d4c43d1683d753e6a6919f688af51553 Mon Sep 17 00:00:00 2001 From: emoose Date: Sat, 13 Apr 2019 20:45:59 +0100 Subject: [PATCH] Fix loading import library modules --- src/xenia/kernel/kernel_state.cc | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/xenia/kernel/kernel_state.cc b/src/xenia/kernel/kernel_state.cc index 570342646..adaa360ed 100644 --- a/src/xenia/kernel/kernel_state.cc +++ b/src/xenia/kernel/kernel_state.cc @@ -227,7 +227,9 @@ object_ref KernelState::GetModule(const std::string_view name, return retain_object(user_module.get()); } } - return nullptr; + + // Module not found, try loading it + return LoadUserModule(name); } object_ref KernelState::LaunchModule(object_ref module) { @@ -272,9 +274,6 @@ object_ref KernelState::GetExecutableModule() { } void KernelState::SetExecutableModule(object_ref module) { - if (module.get() == executable_module_.get()) { - return; - } executable_module_ = std::move(module); if (!executable_module_) { return; @@ -376,8 +375,22 @@ object_ref KernelState::LoadUserModule( // Module wasn't loaded, so load it. module = object_ref(new UserModule(this)); + if (!executable_module_) { + // If there isn't already an executable_module then this must be the one + // Set it before loading so that extra modules loaded during this + // module load (import libs..) can access it + + // (we don't use SetExecutableModule because that sets up a lot of other + // things, we can call that after the load via LaunchModule instead) + + executable_module_ = module; + } + X_STATUS status = module->LoadFromFile(path); if (XFAILED(status)) { + if (executable_module_.get() == module.get()) { + executable_module_.reset(); + } object_table()->ReleaseHandle(module->handle()); return nullptr; }