diff --git a/src/xenia/cpu/xex_module.cc b/src/xenia/cpu/xex_module.cc index 3dbfbe143..beafe98af 100644 --- a/src/xenia/cpu/xex_module.cc +++ b/src/xenia/cpu/xex_module.cc @@ -44,7 +44,8 @@ XexModule::XexModule(Processor* processor, KernelState* kernel_state) xex_header_(nullptr), base_address_(0), low_address_(0), - high_address_(0) {} + high_address_(0), + loaded_(false) {} XexModule::~XexModule() { xe_xex2_dealloc(xex_); @@ -215,7 +216,10 @@ bool XexModule::Load(const std::string& name, const std::string& path, bool XexModule::Load(const std::string& name, const std::string& path, xe_xex2_ref xex) { + assert_false(loaded_); + loaded_ = true; xex_ = xex; + auto header = xex_header_; auto old_header = xe_xex2_get_header(xex_); @@ -296,6 +300,11 @@ bool XexModule::Load(const std::string& name, const std::string& path, } bool XexModule::Unload() { + if (!loaded_) { + return true; + } + loaded_ = false; + // Just deallocate the memory occupied by the exe xe::be* exe_address = 0; GetOptHeader(XEX_HEADER_IMAGE_BASE_ADDRESS, &exe_address); diff --git a/src/xenia/cpu/xex_module.h b/src/xenia/cpu/xex_module.h index 692e0e4fe..aa088a14e 100644 --- a/src/xenia/cpu/xex_module.h +++ b/src/xenia/cpu/xex_module.h @@ -33,6 +33,7 @@ class XexModule : public xe::cpu::Module { virtual ~XexModule(); xe_xex2_ref xex() const { return xex_; } + bool loaded() const { return loaded_; } const xex2_header* xex_header() const { return xex_header_; } const xex2_security_info* xex_security_info() const { return GetSecurityInfo(xex_header_); @@ -86,6 +87,7 @@ class XexModule : public xe::cpu::Module { std::string path_; xe_xex2_ref xex_; xex2_header* xex_header_; + bool loaded_; // Loaded into memory? uint32_t base_address_; uint32_t low_address_;