From cdd60494d730502b0476aa9913db7401cbd43d06 Mon Sep 17 00:00:00 2001 From: The-Little-Wolf <116989599+The-Little-Wolf@users.noreply.github.com> Date: Mon, 17 Aug 2026 10:42:23 -0700 Subject: [PATCH] [XEX] - Add support for dash 1746 - Add support for dash 1746 --- src/xenia/cpu/xex_module.cc | 21 ++++++++++++++++++--- src/xenia/cpu/xex_module.h | 8 ++++---- src/xenia/emulator.cc | 8 ++++---- src/xenia/emulator.h | 2 +- src/xenia/kernel/user_module.cc | 2 +- src/xenia/kernel/util/xex2_info.h | 15 +++++++++++++++ 6 files changed, 43 insertions(+), 13 deletions(-) diff --git a/src/xenia/cpu/xex_module.cc b/src/xenia/cpu/xex_module.cc index 900a5af91..0796b5380 100644 --- a/src/xenia/cpu/xex_module.cc +++ b/src/xenia/cpu/xex_module.cc @@ -888,6 +888,21 @@ int XexModule::ReadPEHeaders() { void XexModule::ReadSecurityInfo() { switch (xex_format_) { + case kFormatXex25: { + const xex25_security_info* xex25_sec_info = + reinterpret_cast( + GetSecurityInfo(xex_header())); + + security_info_.rsa_signature = xex25_sec_info->rsa_signature; + security_info_.aes_key = xex25_sec_info->aes_key; + security_info_.image_size = xex25_sec_info->image_size; + security_info_.image_flags = xex25_sec_info->image_flags; + security_info_.export_table = xex25_sec_info->export_table; + security_info_.load_address = xex25_sec_info->load_address; + security_info_.page_descriptor_count = + xex25_sec_info->page_descriptor_count; + security_info_.page_descriptors = xex25_sec_info->page_descriptors; + } break; case kFormatXex1: { const xex1_security_info* xex1_sec_info = reinterpret_cast( @@ -938,9 +953,9 @@ bool XexModule::Load(const std::string_view name, const std::string_view path, XELOGE("XEX- format not supported"); return false; break; - case kXEXPSignature: - XELOGE("XEX% format not supported"); - return false; + case kXEX25Signature: + xex_format_ = kFormatXex25; + XELOGE("Loading XEX%"); break; case kXEX1Signature: xex_format_ = kFormatXex1; diff --git a/src/xenia/cpu/xex_module.h b/src/xenia/cpu/xex_module.h index 7f0ac364f..c24b6d97e 100644 --- a/src/xenia/cpu/xex_module.h +++ b/src/xenia/cpu/xex_module.h @@ -28,7 +28,7 @@ namespace cpu { constexpr fourcc_t kXEX0Signature = make_fourcc("XEX0"); constexpr fourcc_t kXEXQSignature = make_fourcc("XEX?"); constexpr fourcc_t kXEXHSignature = make_fourcc("XEX-"); -constexpr fourcc_t kXEXPSignature = make_fourcc("XEX%"); +constexpr fourcc_t kXEX25Signature = make_fourcc("XEX%"); constexpr fourcc_t kXEX1Signature = make_fourcc("XEX1"); constexpr fourcc_t kXEX2Signature = make_fourcc("XEX2"); constexpr fourcc_t kElfSignature = make_fourcc(0x7F, 'E', 'L', 'F'); @@ -121,9 +121,9 @@ class XexModule : public xe::cpu::Module { enum XexFormat { kFormatUnknown, kFormatXex0, - kFormatXexQ, // ? - kFormatXexH, // - - kFormatXexP, // % + kFormatXexQ, // ? + kFormatXexH, // - + kFormatXex25, // % kFormatXex1, kFormatXex2, }; diff --git a/src/xenia/emulator.cc b/src/xenia/emulator.cc index 2257429e9..f56993eb5 100644 --- a/src/xenia/emulator.cc +++ b/src/xenia/emulator.cc @@ -373,7 +373,7 @@ const std::unique_ptr Emulator::CreateVfsDevice( case FileSignatureType::XEX0: case FileSignatureType::XEXQ: case FileSignatureType::XEXH: - case FileSignatureType::XEXP: + case FileSignatureType::XEX25: case FileSignatureType::XEX1: case FileSignatureType::XEX2: case FileSignatureType::ELF: { @@ -499,8 +499,8 @@ Emulator::FileSignatureType Emulator::GetFileSignature( return FileSignatureType::XEXQ; case xe::cpu::kXEXHSignature: return FileSignatureType::XEXH; - case xe::cpu::kXEXPSignature: - return FileSignatureType::XEXP; + case xe::cpu::kXEX25Signature: + return FileSignatureType::XEX25; case xe::cpu::kXEX1Signature: return FileSignatureType::XEX1; case xe::cpu::kXEX2Signature: @@ -560,7 +560,7 @@ X_STATUS Emulator::LaunchPath(const std::filesystem::path& path) { case FileSignatureType::XEX0: case FileSignatureType::XEXQ: case FileSignatureType::XEXH: - case FileSignatureType::XEXP: + case FileSignatureType::XEX25: case FileSignatureType::XEX1: case FileSignatureType::XEX2: case FileSignatureType::ELF: { diff --git a/src/xenia/emulator.h b/src/xenia/emulator.h index 7416338d9..b9f04a954 100644 --- a/src/xenia/emulator.h +++ b/src/xenia/emulator.h @@ -204,7 +204,7 @@ class Emulator { XEX0, XEXQ, XEXH, - XEXP, + XEX25, XEX1, XEX2, ELF, diff --git a/src/xenia/kernel/user_module.cc b/src/xenia/kernel/user_module.cc index 1493abd81..a660adef0 100644 --- a/src/xenia/kernel/user_module.cc +++ b/src/xenia/kernel/user_module.cc @@ -134,7 +134,7 @@ X_STATUS UserModule::LoadFromMemory(const void* addr, const size_t length) { magic.value = xe::load(addr); if (magic == xe::cpu::kXEX2Signature || magic == xe::cpu::kXEX1Signature || magic == xe::cpu::kXEXQSignature || magic == xe::cpu::kXEXHSignature || - magic == xe::cpu::kXEXPSignature || magic == xe::cpu::kXEX0Signature) { + magic == xe::cpu::kXEX25Signature || magic == xe::cpu::kXEX0Signature) { module_format_ = kModuleFormatXex; } else if (magic == xe::cpu::kElfSignature) { module_format_ = kModuleFormatElf; diff --git a/src/xenia/kernel/util/xex2_info.h b/src/xenia/kernel/util/xex2_info.h index a7ec034dc..aebee3e60 100644 --- a/src/xenia/kernel/util/xex2_info.h +++ b/src/xenia/kernel/util/xex2_info.h @@ -829,6 +829,21 @@ struct xex1_security_info { xex2_page_descriptor page_descriptors[1]; }; +struct xex25_security_info { + xe::be header_size; + xe::be image_size; + char rsa_signature[0x100]; + char image_digest[0x14]; + char import_table_digest[0x14]; + xe::be load_address; + char aes_key[0x10]; + xe::be image_flags; + xe::be export_table; + xe::be allowed_media_types; + xe::be page_descriptor_count; + xex2_page_descriptor page_descriptors[1]; +}; + struct xex2_export_table { xe::be magic[3]; // 0x0 xe::be modulenumber[2]; // 0xC