XUserModule::GetOptHeader

This commit is contained in:
Dr. Chat
2015-06-27 22:41:09 -05:00
parent cdbf736241
commit 8a6c620fe7
5 changed files with 54 additions and 32 deletions

View File

@@ -22,14 +22,9 @@ namespace kernel {
using namespace xe::cpu;
XUserModule::XUserModule(KernelState* kernel_state, const char* path)
: XModule(kernel_state, ModuleType::kUserModule, path),
xex_(nullptr),
execution_info_ptr_(0) {}
: XModule(kernel_state, ModuleType::kUserModule, path), xex_(nullptr) {}
XUserModule::~XUserModule() {
kernel_state()->memory()->SystemHeapFree(execution_info_ptr_);
xe_xex2_dealloc(xex_);
}
XUserModule::~XUserModule() { xe_xex2_dealloc(xex_); }
xe_xex2_ref XUserModule::xex() { return xex_; }
@@ -114,7 +109,7 @@ X_STATUS XUserModule::LoadFromMemory(const void* addr, const size_t length) {
auto ldr_data =
memory()->TranslateVirtual<X_LDR_DATA_TABLE_ENTRY*>(hmodule_ptr_);
ldr_data->dll_base = 0; // GetProcAddress will read this.
ldr_data->dll_base = 0; // GetProcAddress will read this.
ldr_data->xex_header_base = xex_header_;
// Prepare the module for execution.
@@ -156,6 +151,24 @@ X_STATUS XUserModule::GetSection(const char* name, uint32_t* out_section_data,
return X_STATUS_UNSUCCESSFUL;
}
X_STATUS XUserModule::GetOptHeader(xe_xex2_header_keys key,
uint32_t* out_header_guest_ptr) {
assert_not_null(out_header_guest_ptr);
auto header = memory()->TranslateVirtual<xex2_header*>(xex_header_);
if (!header) {
return X_STATUS_UNSUCCESSFUL;
}
auto ptr = xex2_get_opt_header(header, key);
if (!ptr) {
return X_STATUS_NOT_FOUND;
}
*out_header_guest_ptr = (uint32_t)(ptr - memory()->virtual_membase());
return X_STATUS_SUCCESS;
}
X_STATUS XUserModule::Launch(uint32_t flags) {
const xe_xex2_header_t* header = xex_header();

View File

@@ -35,6 +35,7 @@ class XUserModule : public XModule {
uint32_t GetProcAddressByName(const char* name) override;
X_STATUS GetSection(const char* name, uint32_t* out_section_data,
uint32_t* out_section_size) override;
X_STATUS GetOptHeader(xe_xex2_header_keys key, uint32_t* out_header_guest_ptr);
X_STATUS Launch(uint32_t flags);