From 224f38d84d94ecc12f4cf5b286967109ff3d9504 Mon Sep 17 00:00:00 2001 From: midipix Date: Wed, 18 Oct 2017 12:09:39 +0000 Subject: ldso: added pe_load_framework_library(). --- src/ldso/pe_load_framework_loader.c | 79 +++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) (limited to 'src') diff --git a/src/ldso/pe_load_framework_loader.c b/src/ldso/pe_load_framework_loader.c index e70c183..347d3ab 100644 --- a/src/ldso/pe_load_framework_loader.c +++ b/src/ldso/pe_load_framework_loader.c @@ -259,3 +259,82 @@ int32_t pe_load_framework_loader( buffer,bufsize, sysflags); } + + +int32_t pe_load_framework_library( + void ** baseaddr, + void * hat, + const wchar16_t * atrelname, + uintptr_t * buffer, + uint32_t bufsize, + uint32_t * sysflags) +{ + int32_t status; + struct pe_unicode_str path; + struct os_oa oa; + struct os_iosb iosb; + const wchar16_t * wch; + const wchar16_t * wch_cap; + void * hdsolib; + void * hntdll; + os_zw_close * zw_close; + os_zw_open_file * zw_open_file; + + /* init */ + if (!(hntdll = pe_get_ntdll_module_handle())) + return OS_STATUS_INTERNAL_ERROR; + + if (!(zw_close = (os_zw_close *)pe_get_procedure_address( + hntdll,"ZwClose"))) + return OS_STATUS_INTERNAL_ERROR; + + if (!(zw_open_file = (os_zw_open_file *)pe_get_procedure_address( + hntdll,"ZwOpenFile"))) + return OS_STATUS_INTERNAL_ERROR; + + /* oa */ + oa.len = sizeof(struct os_oa); + oa.root_dir = hat; + oa.obj_name = &path; + oa.obj_attr = 0; + oa.sec_desc = 0; + oa.sec_qos = 0; + + /* at-relative path */ + wch = atrelname; + wch_cap = atrelname + 512; + + for (; *wch && wch