diff --git a/include/pemagine/pe_ldso.h b/include/pemagine/pe_ldso.h index f7ae6af..7f6382c 100644 --- a/include/pemagine/pe_ldso.h +++ b/include/pemagine/pe_ldso.h @@ -33,6 +33,7 @@ #define pe_get_symbol_module_info __ldso_get_symbol_module_info #define pe_get_symbol_name __ldso_get_symbol_name #define pe_load_framework_loader __ldso_load_framework_loader +#define pe_load_framework_loader_ex __ldso_load_framework_loader_ex #define pe_open_image_from_addr __ldso_open_image_from_addr #define pe_open_physical_parent_directory __ldso_open_physical_parent_directory #define pe_terminate_current_process __ldso_terminate_current_process diff --git a/include/pemagine/pemagine.h b/include/pemagine/pemagine.h index 0edd08e..9cfe47a 100644 --- a/include/pemagine/pemagine.h +++ b/include/pemagine/pemagine.h @@ -265,6 +265,20 @@ pe_api int32_t pe_load_framework_loader( uint32_t * flags); +pe_api int32_t pe_load_framework_loader_ex( + void ** baseaddr, + void ** hroot, + void ** hdsodir, + const struct pe_guid * abi, + const wchar16_t * basename, + const wchar16_t * rrelname, + void * refaddr, + uintptr_t * buffer, + uint32_t bufsize, + uint32_t flags, + uint32_t * sysflags); + + pe_api int32_t pe_open_image_from_addr( void ** himage, void * addr, diff --git a/project/common.mk b/project/common.mk index 719394e..5ff3a1e 100644 --- a/project/common.mk +++ b/project/common.mk @@ -14,6 +14,7 @@ API_SRCS = \ src/ldso/pe_get_peb_strings.c \ src/ldso/pe_find_framework_loader.c \ src/ldso/pe_load_framework_loader.c \ + src/ldso/pe_load_framework_loader_ex.c \ src/ldso/pe_open_image_from_addr.c \ src/ldso/pe_open_physical_parent_directory.c \ src/ldso/pe_terminate_current_process.c \ diff --git a/src/ldso/pe_load_framework_loader_ex.c b/src/ldso/pe_load_framework_loader_ex.c new file mode 100644 index 0000000..80aa8b1 --- /dev/null +++ b/src/ldso/pe_load_framework_loader_ex.c @@ -0,0 +1,74 @@ +/*****************************************************************************/ +/* pemagination: a (virtual) tour into portable bits and executable bytes */ +/* Copyright (C) 2013--2017 Z. Gilboa */ +/* Released under GPLv2 and GPLv3; see COPYING.PEMAGINE. */ +/*****************************************************************************/ + +#include +#include +#include "pe_os.h" + +int32_t pe_load_framework_loader_ex( + void ** baseaddr, + void ** hroot, + void ** hdsodir, + const struct pe_guid * abi, + const wchar16_t * basename, + const wchar16_t * rrelname, + void * refaddr, + uintptr_t * buffer, + uint32_t bufsize, + uint32_t flags, + uint32_t * sysflags) +{ + int32_t status; + struct pe_framework_runtime_data * rtdata; + struct pe_framework_runtime_data context; + + status = pe_get_framework_runtime_data( + &rtdata, + pe_get_peb_command_line(), + abi); + + if (status) { + context.hself = 0; + context.hparent = 0; + context.himage = 0; + context.hroot = 0; + context.hdsodir = 0; + context.hloader = 0; + context.hcwd = 0; + context.hdrive = 0; + + context.abi.data1 = abi->data1; + context.abi.data1 = abi->data2; + context.abi.data1 = abi->data3; + + context.abi.data4[0] = abi->data4[0]; + context.abi.data4[1] = abi->data4[1]; + context.abi.data4[2] = abi->data4[2]; + context.abi.data4[3] = abi->data4[3]; + context.abi.data4[4] = abi->data4[4]; + context.abi.data4[5] = abi->data4[5]; + context.abi.data4[6] = abi->data4[6]; + context.abi.data4[7] = abi->data4[7]; + + rtdata = &context; + } + + if ((status = pe_find_framework_loader( + rtdata,basename,rrelname,refaddr, + buffer,bufsize,flags))) + return status; + + if ((status = pe_load_framework_loader( + baseaddr,rtdata, + buffer,bufsize, + sysflags))) + return status; + + *hroot = rtdata->hroot; + *hdsodir = rtdata->hdsodir; + + return OS_STATUS_SUCCESS; +}