Skip to content
Snippets Groups Projects
Commit b6eec865 authored by Billy Laws's avatar Billy Laws Committed by Alexandre Julliard
Browse files

ntdll: Add arm64ec_get_module_metadata helper.

parent e5adcbff
No related branches found
No related tags found
No related merge requests found
......@@ -169,6 +169,7 @@ extern void heap_thread_detach(void);
extern NTSTATUS arm64ec_process_init( HMODULE module );
extern NTSTATUS arm64ec_thread_init(void);
extern IMAGE_ARM64EC_METADATA *arm64ec_get_module_metadata( HMODULE module );
extern void arm64ec_update_hybrid_metadata( void *module, IMAGE_NT_HEADERS *nt,
const IMAGE_ARM64EC_METADATA *metadata );
extern void invoke_arm64ec_syscall(void);
......
......@@ -220,6 +220,24 @@ NTSTATUS arm64ec_thread_init(void)
}
/**********************************************************************
* arm64ec_get_module_metadata
*/
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;
}
static void update_hybrid_pointer( void *module, const IMAGE_SECTION_HEADER *sec, UINT rva, void *ptr )
{
if (!rva) return;
......
......@@ -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);
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment