From: Billy Laws blaws05@gmail.com
--- dlls/ntdll/loader.c | 14 ++++++++++++++ dlls/ntdll/ntdll_misc.h | 1 + dlls/ntdll/unwind.c | 12 ++---------- 3 files changed, 17 insertions(+), 10 deletions(-)
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index 38516115b38..d68f192f19f 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -329,6 +329,20 @@ static void update_hybrid_metadata( void *module, IMAGE_NT_HEADERS *nt, ERR( "module %p no section found for %lx\n", module, metadata->__os_arm64x_dispatch_call ); }
+IMAGE_ARM64EC_METADATA *arm64ec_get_module_metadata( HMODULE module ) +{ + IMAGE_LOAD_CONFIG_DIRECTORY *cfg; + ULONG size; + + if (!(cfg = RtlImageDirectoryEntryToData( module, TRUE, + IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG, &size ))) + return NULL; + + size = min( size, cfg->Size ); + if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY, CHPEMetadataPointer )) return NULL; + return (IMAGE_ARM64EC_METADATA *)cfg->CHPEMetadataPointer; +} + #endif
/********************************************************************* diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index e58a07ba02a..d5161ee17f8 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h @@ -165,6 +165,7 @@ extern void heap_thread_detach(void); extern NTSTATUS arm64ec_process_init( HMODULE module ); extern NTSTATUS arm64ec_thread_init(void); extern void invoke_arm64ec_syscall(void); +extern IMAGE_ARM64EC_METADATA *arm64ec_get_module_metadata( HMODULE module );
extern void *__os_arm64x_check_call; extern void *__os_arm64x_check_icall; diff --git a/dlls/ntdll/unwind.c b/dlls/ntdll/unwind.c index 91b07a7cc8c..c11bd9ddb9c 100644 --- a/dlls/ntdll/unwind.c +++ b/dlls/ntdll/unwind.c @@ -267,16 +267,8 @@ PRUNTIME_FUNCTION WINAPI RtlLookupFunctionTable( ULONG_PTR pc, ULONG_PTR *base, #ifdef __arm64ec__ if (RtlIsEcCode( pc )) { - IMAGE_LOAD_CONFIG_DIRECTORY *cfg; - IMAGE_ARM64EC_METADATA *metadata; - ULONG size; - - if (!(cfg = RtlImageDirectoryEntryToData( module->DllBase, TRUE, - IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG, &size ))) - return NULL; - size = min( size, cfg->Size ); - if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY, CHPEMetadataPointer )) return NULL; - metadata = (IMAGE_ARM64EC_METADATA *)cfg->CHPEMetadataPointer; + IMAGE_ARM64EC_METADATA *metadata = arm64ec_get_module_metadata( module->DllBase ); + if (!metadata) return NULL; *len = metadata->ExtraRFETableSize; return (RUNTIME_FUNCTION *)(*base + metadata->ExtraRFETable); }