From 0ee6c77d914a5501565b3560ebaefb7bcc8e75ec Mon Sep 17 00:00:00 2001 From: Gliniak Date: Thu, 5 Sep 2024 22:41:35 +0200 Subject: [PATCH] [Kernel] Update ExLoadedCommandLine based on executable name --- src/xenia/kernel/kernel_state.cc | 21 ++++++++++++++++++++ src/xenia/kernel/xboxkrnl/xboxkrnl_module.cc | 3 ++- src/xenia/kernel/xboxkrnl/xboxkrnl_module.h | 2 ++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/xenia/kernel/kernel_state.cc b/src/xenia/kernel/kernel_state.cc index a9239a8d6..b8c1cdc5e 100644 --- a/src/xenia/kernel/kernel_state.cc +++ b/src/xenia/kernel/kernel_state.cc @@ -41,6 +41,8 @@ DEFINE_uint32(max_signed_profiles, 4, DEFINE_uint32(kernel_build_version, 1888, "Define current kernel version", "Kernel"); +DECLARE_string(cl); + namespace xe { namespace kernel { @@ -386,6 +388,25 @@ void KernelState::SetExecutableModule(object_ref module) { variable_ptr, executable_module_->path(), xboxkrnl::XboxkrnlModule::kExLoadedImageNameSize); } + + // Setup the kernel's ExLoadedCommandLine field + export_entry = processor()->export_resolver()->GetExportByOrdinal( + "xboxkrnl.exe", ordinals::ExLoadedCommandLine); + if (export_entry) { + char* variable_ptr = + memory()->TranslateVirtual(export_entry->variable_ptr); + + std::string module_name = + fmt::format("\"{}.xex\"", executable_module_->name()); + if (!cvars::cl.empty()) { + module_name += " " + cvars::cl; + } + + xe::string_util::copy_truncating( + variable_ptr, module_name, + xboxkrnl::XboxkrnlModule::kExLoadedCommandLineSize); + } + // Spin up deferred dispatch worker. // TODO(benvanik): move someplace more appropriate (out of ctor, but around // here). diff --git a/src/xenia/kernel/xboxkrnl/xboxkrnl_module.cc b/src/xenia/kernel/xboxkrnl/xboxkrnl_module.cc index be5e9ac75..1474715e7 100644 --- a/src/xenia/kernel/xboxkrnl/xboxkrnl_module.cc +++ b/src/xenia/kernel/xboxkrnl/xboxkrnl_module.cc @@ -193,7 +193,8 @@ XboxkrnlModule::XboxkrnlModule(Emulator* emulator, KernelState* kernel_state) command_line += " " + cvars::cl; } uint32_t command_line_length = - xe::align(static_cast(command_line.length()) + 1, 1024u); + xe::align(static_cast(command_line.length()) + 1, + static_cast(kExLoadedCommandLineSize)); uint32_t pExLoadedCommandLine = memory_->SystemHeapAlloc(command_line_length); auto lpExLoadedCommandLine = memory_->TranslateVirtual(pExLoadedCommandLine); export_resolver_->SetVariableMapping( diff --git a/src/xenia/kernel/xboxkrnl/xboxkrnl_module.h b/src/xenia/kernel/xboxkrnl/xboxkrnl_module.h index 348f07d67..e76bf8db8 100644 --- a/src/xenia/kernel/xboxkrnl/xboxkrnl_module.h +++ b/src/xenia/kernel/xboxkrnl/xboxkrnl_module.h @@ -28,6 +28,8 @@ namespace xboxkrnl { class XboxkrnlModule : public KernelModule { public: static constexpr size_t kExLoadedImageNameSize = 255 + 1; + static constexpr size_t kExLoadedCommandLineSize = + 1024; // Based on max size provided for XamLoaderGetLaunchData XboxkrnlModule(Emulator* emulator, KernelState* kernel_state); virtual ~XboxkrnlModule();