winedump: Dump hybrid metadata also for i386 CHPE modules.

This commit is contained in:
Alexandre Julliard 2023-04-18 17:49:51 +02:00
parent 6e348640c5
commit fe693a7047

View file

@ -1777,99 +1777,122 @@ static void dump_dir_imported_functions(void)
static void dump_hybrid_metadata(void)
{
unsigned int i;
const struct
{
unsigned int version;
unsigned int code_map;
unsigned int code_map_count;
unsigned int code_ranges_to_ep;
unsigned int redir_metadata;
unsigned int __os_arm64x_dispatch_call_no_redirect;
unsigned int __os_arm64x_dispatch_ret;
unsigned int __os_arm64x_check_call;
unsigned int __os_arm64x_check_icall;
unsigned int __os_arm64x_check_icall_cfg;
unsigned int alt_entry;
unsigned int aux_iat;
unsigned int code_ranges_to_ep_count;
unsigned int redir_metadata_count;
unsigned int __os_arm64x_get_x64_information;
unsigned int __os_arm64x_set_x64_information;
unsigned int except_data;
unsigned int except_data_size;
unsigned int __os_arm64x_jump;
unsigned int aux_iat_copy;
} *data = get_hybrid_metadata();
const void *metadata = get_hybrid_metadata();
if (!data) return;
if (!metadata) return;
printf( "Hybrid metadata\n" );
print_dword( "Version", data->version );
print_dword( "Code map", data->code_map );
print_dword( "Code map count", data->code_map_count );
print_dword( "Code ranges to entry points", data->code_ranges_to_ep );
print_dword( "Redirection metadata", data->redir_metadata );
print_dword( "__os_arm64x_dispatch_call_no_redirect", data->__os_arm64x_dispatch_call_no_redirect );
print_dword( "__os_arm64x_dispatch_ret", data->__os_arm64x_dispatch_ret );
print_dword( "__os_arm64x_check_call", data->__os_arm64x_check_call );
print_dword( "__os_arm64x_check_icall", data->__os_arm64x_check_icall );
print_dword( "__os_arm64x_check_icall_cfg", data->__os_arm64x_check_icall_cfg );
print_dword( "Alternate entry point", data->alt_entry );
print_dword( "Auxiliary IAT", data->aux_iat );
print_dword( "Code ranges to entry points count", data->code_ranges_to_ep_count );
print_dword( "Redirection metadata count", data->redir_metadata_count );
print_dword( "__os_arm64x_get_x64_information", data->__os_arm64x_get_x64_information );
print_dword( "__os_arm64x_set_x64_information", data->__os_arm64x_set_x64_information );
print_dword( "Exception data", data->except_data );
print_dword( "Exception data size", data->except_data_size );
print_dword( "__os_arm64x_jump", data->__os_arm64x_jump );
print_dword( "Auxiliary IAT copy", data->aux_iat_copy );
if (data->code_map)
switch (PE_nt_headers->FileHeader.Machine)
{
const struct
{
unsigned int start : 30;
unsigned int type : 2;
unsigned int len;
} *map = RVA( data->code_map, data->code_map_count * sizeof(*map) );
case IMAGE_FILE_MACHINE_I386:
{
const IMAGE_CHPE_METADATA_X86 *data = metadata;
printf( "\nCode ranges\n" );
for (i = 0; i < data->code_map_count; i++)
printf( " Version %#x\n", (int)data->Version );
printf( " CHPECodeAddressRangeOffset %#x\n", (int)data->CHPECodeAddressRangeOffset );
printf( " CHPECodeAddressRangeCount %#x\n", (int)data->CHPECodeAddressRangeCount );
printf( " WowA64ExceptionHandlerFunctionPointer %#x\n", (int)data->WowA64ExceptionHandlerFunctionPointer );
printf( " WowA64DispatchCallFunctionPointer %#x\n", (int)data->WowA64DispatchCallFunctionPointer );
printf( " WowA64DispatchIndirectCallFunctionPointer %#x\n", (int)data->WowA64DispatchIndirectCallFunctionPointer );
printf( " WowA64DispatchIndirectCallCfgFunctionPointer %#x\n", (int)data->WowA64DispatchIndirectCallCfgFunctionPointer );
printf( " WowA64DispatchRetFunctionPointer %#x\n", (int)data->WowA64DispatchRetFunctionPointer );
printf( " WowA64DispatchRetLeafFunctionPointer %#x\n", (int)data->WowA64DispatchRetLeafFunctionPointer );
printf( " WowA64DispatchJumpFunctionPointer %#x\n", (int)data->WowA64DispatchJumpFunctionPointer );
if (data->Version >= 2)
printf( " CompilerIATPointer %#x\n", (int)data->CompilerIATPointer );
if (data->Version >= 3)
printf( " WowA64RdtscFunctionPointer %#x\n", (int)data->WowA64RdtscFunctionPointer );
if (data->Version >= 4)
{
static const char *types[] = { "ARM64", "ARM64EC", "x64", "??" };
unsigned int start = map[i].start & ~0x3;
unsigned int type = map[i].start & 0x3;
printf( " %08x - %08x %s\n", start, start + map[i].len, types[type] );
printf( " unknown[0] %#x\n", (int)data->unknown[0] );
printf( " unknown[1] %#x\n", (int)data->unknown[1] );
printf( " unknown[2] %#x\n", (int)data->unknown[2] );
printf( " unknown[3] %#x\n", (int)data->unknown[3] );
}
}
if (data->code_ranges_to_ep)
{
const struct
if (data->CHPECodeAddressRangeOffset)
{
unsigned int start;
unsigned int end;
unsigned int func;
} *map = RVA( data->code_ranges_to_ep, data->code_ranges_to_ep_count * sizeof(*map) );
const IMAGE_CHPE_RANGE_ENTRY *map = RVA( data->CHPECodeAddressRangeOffset,
data->CHPECodeAddressRangeCount * sizeof(*map) );
printf( "\nCode ranges to entry points\n" );
printf( " Start - End Entry point\n" );
for (i = 0; i < data->code_ranges_to_ep_count; i++)
printf( " %08x - %08x %08x\n", map[i].start, map[i].end, map[i].func );
printf( "\nCode ranges\n" );
for (i = 0; i < data->CHPECodeAddressRangeCount; i++)
{
static const char *types[] = { "x86", "ARM64" };
unsigned int start = map[i].StartOffset & ~1;
unsigned int type = map[i].Length & 1;
printf( " %08x - %08x %s\n", start, start + (int)map[i].Length, types[type] );
}
}
break;
}
if (data->redir_metadata)
case IMAGE_FILE_MACHINE_AMD64:
case IMAGE_FILE_MACHINE_ARM64:
{
const struct
{
unsigned int func;
unsigned int redir;
} *map = RVA( data->redir_metadata, data->redir_metadata_count * sizeof(*map) );
const IMAGE_ARM64EC_METADATA *data = metadata;
printf( "\nEntry point redirection\n" );
for (i = 0; i < data->redir_metadata_count; i++)
printf( " %08x -> %08x\n", map[i].func, map[i].redir );
printf( "Version %#x\n", (int)data->Version );
printf( "CodeMap %#x\n", (int)data->CodeMap );
printf( "CodeMapCount %#x\n", (int)data->CodeMapCount );
printf( "CodeRangesToEntryPoints %#x\n", (int)data->CodeRangesToEntryPoints );
printf( "RedirectionMetadata %#x\n", (int)data->RedirectionMetadata );
printf( "__os_arm64x_dispatch_call_no_redirect %#x\n", (int)data->__os_arm64x_dispatch_call_no_redirect );
printf( "__os_arm64x_dispatch_ret %#x\n", (int)data->__os_arm64x_dispatch_ret );
printf( "__os_arm64x_dispatch_call %#x\n", (int)data->__os_arm64x_dispatch_call );
printf( "__os_arm64x_dispatch_icall %#x\n", (int)data->__os_arm64x_dispatch_icall );
printf( "__os_arm64x_dispatch_icall_cfg %#x\n", (int)data->__os_arm64x_dispatch_icall_cfg );
printf( "AlternateEntryPoint %#x\n", (int)data->AlternateEntryPoint );
printf( "AuxiliaryIAT %#x\n", (int)data->AuxiliaryIAT );
printf( "CodeRangesToEntryPointsCount %#x\n", (int)data->CodeRangesToEntryPointsCount );
printf( "RedirectionMetadataCount %#x\n", (int)data->RedirectionMetadataCount );
printf( "GetX64InformationFunctionPointer %#x\n", (int)data->GetX64InformationFunctionPointer );
printf( "SetX64InformationFunctionPointer %#x\n", (int)data->SetX64InformationFunctionPointer );
printf( "ExtraRFETable %#x\n", (int)data->ExtraRFETable );
printf( "ExtraRFETableSize %#x\n", (int)data->ExtraRFETableSize );
printf( "__os_arm64x_dispatch_fptr %#x\n", (int)data->__os_arm64x_dispatch_fptr );
printf( "AuxiliaryIATCopy %#x\n", (int)data->AuxiliaryIATCopy );
if (data->CodeMap)
{
const IMAGE_CHPE_RANGE_ENTRY *map = RVA( data->CodeMap, data->CodeMapCount * sizeof(*map) );
printf( "\nCode ranges\n" );
for (i = 0; i < data->CodeMapCount; i++)
{
static const char *types[] = { "ARM64", "ARM64EC", "x64", "??" };
unsigned int start = map[i].StartOffset & ~0x3;
unsigned int type = map[i].Length & 0x3;
printf( " %08x - %08x %s\n", start, start + (int)map[i].Length, types[type] );
}
}
if (data->CodeRangesToEntryPoints)
{
const IMAGE_ARM64EC_CODE_RANGE_ENTRY_POINT *map = RVA( data->CodeRangesToEntryPoints,
data->CodeRangesToEntryPointsCount * sizeof(*map) );
printf( "\nCode ranges to entry points\n" );
printf( " Start - End Entry point\n" );
for (i = 0; i < data->CodeRangesToEntryPointsCount; i++)
printf( " %08x - %08x %08x\n",
(int)map[i].StartRva, (int)map[i].EndRva, (int)map[i].EntryPoint );
}
if (data->RedirectionMetadata)
{
const IMAGE_ARM64EC_REDIRECTION_ENTRY *map = RVA( data->RedirectionMetadata,
data->RedirectionMetadataCount * sizeof(*map) );
printf( "\nEntry point redirection\n" );
for (i = 0; i < data->RedirectionMetadataCount; i++)
printf( " %08x -> %08x\n", (int)map[i].Source, (int)map[i].Destination );
}
break;
}
}
printf( "\n" );
}
static void dump_dir_loadconfig(void)
@ -1903,52 +1926,52 @@ static void dump_dir_loadconfig(void)
print_word( "CSDVersion", loadcfg64->CSDVersion );
print_word( "DependentLoadFlags", loadcfg64->DependentLoadFlags );
print_longlong( "SecurityCookie", loadcfg64->SecurityCookie );
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY64, SEHandlerTable )) return;
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY64, SEHandlerTable )) goto done;
print_longlong( "SEHandlerTable", loadcfg64->SEHandlerTable );
print_longlong( "SEHandlerCount", loadcfg64->SEHandlerCount );
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY64, GuardCFCheckFunctionPointer )) return;
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY64, GuardCFCheckFunctionPointer )) goto done;
print_longlong( "GuardCFCheckFunctionPointer", loadcfg64->GuardCFCheckFunctionPointer );
print_longlong( "GuardCFDispatchFunctionPointer", loadcfg64->GuardCFDispatchFunctionPointer );
print_longlong( "GuardCFFunctionTable", loadcfg64->GuardCFFunctionTable );
print_longlong( "GuardCFFunctionCount", loadcfg64->GuardCFFunctionCount );
print_dword( "GuardFlags", loadcfg64->GuardFlags );
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY64, CodeIntegrity )) return;
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY64, CodeIntegrity )) goto done;
print_word( "CodeIntegrity.Flags", loadcfg64->CodeIntegrity.Flags );
print_word( "CodeIntegrity.Catalog", loadcfg64->CodeIntegrity.Catalog );
print_dword( "CodeIntegrity.CatalogOffset", loadcfg64->CodeIntegrity.CatalogOffset );
print_dword( "CodeIntegrity.Reserved", loadcfg64->CodeIntegrity.Reserved );
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY64, GuardAddressTakenIatEntryTable )) return;
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY64, GuardAddressTakenIatEntryTable )) goto done;
print_longlong( "GuardAddressTakenIatEntryTable", loadcfg64->GuardAddressTakenIatEntryTable );
print_longlong( "GuardAddressTakenIatEntryCount", loadcfg64->GuardAddressTakenIatEntryCount );
print_longlong( "GuardLongJumpTargetTable", loadcfg64->GuardLongJumpTargetTable );
print_longlong( "GuardLongJumpTargetCount", loadcfg64->GuardLongJumpTargetCount );
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY64, DynamicValueRelocTable )) return;
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY64, DynamicValueRelocTable )) goto done;
print_longlong( "DynamicValueRelocTable", loadcfg64->DynamicValueRelocTable );
print_longlong( "CHPEMetadataPointer", loadcfg64->CHPEMetadataPointer );
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY64, GuardRFFailureRoutine )) return;
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY64, GuardRFFailureRoutine )) goto done;
print_longlong( "GuardRFFailureRoutine", loadcfg64->GuardRFFailureRoutine );
print_longlong( "GuardRFFailureRoutineFunctionPointer", loadcfg64->GuardRFFailureRoutineFunctionPointer );
print_longlong( "GuardRFFailureRoutineFuncPtr", loadcfg64->GuardRFFailureRoutineFunctionPointer );
print_dword( "DynamicValueRelocTableOffset", loadcfg64->DynamicValueRelocTableOffset );
print_word( "DynamicValueRelocTableSection",loadcfg64->DynamicValueRelocTableSection );
print_word( "Reserved2", loadcfg64->Reserved2 );
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY64, GuardRFVerifyStackPointerFunctionPointer )) return;
print_longlong( "GuardRFVerifyStackPointerFunctionPointer", loadcfg64->GuardRFVerifyStackPointerFunctionPointer );
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY64, GuardRFVerifyStackPointerFunctionPointer )) goto done;
print_longlong( "GuardRFVerifyStackPointerFuncPtr", loadcfg64->GuardRFVerifyStackPointerFunctionPointer );
print_dword( "HotPatchTableOffset", loadcfg64->HotPatchTableOffset );
print_dword( "Reserved3", loadcfg64->Reserved3 );
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY64, EnclaveConfigurationPointer )) return;
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY64, EnclaveConfigurationPointer )) goto done;
print_longlong( "EnclaveConfigurationPointer", loadcfg64->EnclaveConfigurationPointer );
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY64, VolatileMetadataPointer )) return;
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY64, VolatileMetadataPointer )) goto done;
print_longlong( "VolatileMetadataPointer", loadcfg64->VolatileMetadataPointer );
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY64, GuardEHContinuationTable )) return;
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY64, GuardEHContinuationTable )) goto done;
print_longlong( "GuardEHContinuationTable", loadcfg64->GuardEHContinuationTable );
print_longlong( "GuardEHContinuationCount", loadcfg64->GuardEHContinuationCount );
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY64, GuardXFGCheckFunctionPointer )) return;
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY64, GuardXFGCheckFunctionPointer )) goto done;
print_longlong( "GuardXFGCheckFunctionPointer", loadcfg64->GuardXFGCheckFunctionPointer );
print_longlong( "GuardXFGDispatchFunctionPointer", loadcfg64->GuardXFGDispatchFunctionPointer );
print_longlong( "GuardXFGTableDispatchFunctionPointer", loadcfg64->GuardXFGTableDispatchFunctionPointer );
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY64, CastGuardOsDeterminedFailureMode )) return;
print_longlong( "GuardXFGTableDispatchFuncPtr", loadcfg64->GuardXFGTableDispatchFunctionPointer );
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY64, CastGuardOsDeterminedFailureMode )) goto done;
print_longlong( "CastGuardOsDeterminedFailureMode", loadcfg64->CastGuardOsDeterminedFailureMode );
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY64, GuardMemcpyFunctionPointer )) return;
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY64, GuardMemcpyFunctionPointer )) goto done;
print_longlong( "GuardMemcpyFunctionPointer", loadcfg64->GuardMemcpyFunctionPointer );
}
else
@ -1962,54 +1985,55 @@ static void dump_dir_loadconfig(void)
print_word( "CSDVersion", loadcfg32->CSDVersion );
print_word( "DependentLoadFlags", loadcfg32->DependentLoadFlags );
print_dword( "SecurityCookie", loadcfg32->SecurityCookie );
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY32, SEHandlerTable )) return;
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY32, SEHandlerTable )) goto done;
print_dword( "SEHandlerTable", loadcfg32->SEHandlerTable );
print_dword( "SEHandlerCount", loadcfg32->SEHandlerCount );
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY32, GuardCFCheckFunctionPointer )) return;
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY32, GuardCFCheckFunctionPointer )) goto done;
print_dword( "GuardCFCheckFunctionPointer", loadcfg32->GuardCFCheckFunctionPointer );
print_dword( "GuardCFDispatchFunctionPointer", loadcfg32->GuardCFDispatchFunctionPointer );
print_dword( "GuardCFFunctionTable", loadcfg32->GuardCFFunctionTable );
print_dword( "GuardCFFunctionCount", loadcfg32->GuardCFFunctionCount );
print_dword( "GuardFlags", loadcfg32->GuardFlags );
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY32, CodeIntegrity )) return;
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY32, CodeIntegrity )) goto done;
print_word( "CodeIntegrity.Flags", loadcfg32->CodeIntegrity.Flags );
print_word( "CodeIntegrity.Catalog", loadcfg32->CodeIntegrity.Catalog );
print_dword( "CodeIntegrity.CatalogOffset", loadcfg32->CodeIntegrity.CatalogOffset );
print_dword( "CodeIntegrity.Reserved", loadcfg32->CodeIntegrity.Reserved );
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY32, GuardAddressTakenIatEntryTable )) return;
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY32, GuardAddressTakenIatEntryTable )) goto done;
print_dword( "GuardAddressTakenIatEntryTable", loadcfg32->GuardAddressTakenIatEntryTable );
print_dword( "GuardAddressTakenIatEntryCount", loadcfg32->GuardAddressTakenIatEntryCount );
print_dword( "GuardLongJumpTargetTable", loadcfg32->GuardLongJumpTargetTable );
print_dword( "GuardLongJumpTargetCount", loadcfg32->GuardLongJumpTargetCount );
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY32, DynamicValueRelocTable )) return;
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY32, DynamicValueRelocTable )) goto done;
print_dword( "DynamicValueRelocTable", loadcfg32->DynamicValueRelocTable );
print_dword( "CHPEMetadataPointer", loadcfg32->CHPEMetadataPointer );
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY32, GuardRFFailureRoutine )) return;
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY32, GuardRFFailureRoutine )) goto done;
print_dword( "GuardRFFailureRoutine", loadcfg32->GuardRFFailureRoutine );
print_dword( "GuardRFFailureRoutineFunctionPointer", loadcfg32->GuardRFFailureRoutineFunctionPointer );
print_dword( "GuardRFFailureRoutineFuncPtr", loadcfg32->GuardRFFailureRoutineFunctionPointer );
print_dword( "DynamicValueRelocTableOffset", loadcfg32->DynamicValueRelocTableOffset );
print_word( "DynamicValueRelocTableSection", loadcfg32->DynamicValueRelocTableSection );
print_word( "Reserved2", loadcfg32->Reserved2 );
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY32, GuardRFVerifyStackPointerFunctionPointer )) return;
print_dword( "GuardRFVerifyStackPointerFunctionPointer", loadcfg32->GuardRFVerifyStackPointerFunctionPointer );
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY32, GuardRFVerifyStackPointerFunctionPointer )) goto done;
print_dword( "GuardRFVerifyStackPointerFuncPtr", loadcfg32->GuardRFVerifyStackPointerFunctionPointer );
print_dword( "HotPatchTableOffset", loadcfg32->HotPatchTableOffset );
print_dword( "Reserved3", loadcfg32->Reserved3 );
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY32, EnclaveConfigurationPointer )) return;
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY32, EnclaveConfigurationPointer )) goto done;
print_dword( "EnclaveConfigurationPointer", loadcfg32->EnclaveConfigurationPointer );
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY32, VolatileMetadataPointer )) return;
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY32, VolatileMetadataPointer )) goto done;
print_dword( "VolatileMetadataPointer", loadcfg32->VolatileMetadataPointer );
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY32, GuardEHContinuationTable )) return;
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY32, GuardEHContinuationTable )) goto done;
print_dword( "GuardEHContinuationTable", loadcfg32->GuardEHContinuationTable );
print_dword( "GuardEHContinuationCount", loadcfg32->GuardEHContinuationCount );
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY32, GuardXFGCheckFunctionPointer )) return;
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY32, GuardXFGCheckFunctionPointer )) goto done;
print_dword( "GuardXFGCheckFunctionPointer", loadcfg32->GuardXFGCheckFunctionPointer );
print_dword( "GuardXFGDispatchFunctionPointer", loadcfg32->GuardXFGDispatchFunctionPointer );
print_dword( "GuardXFGTableDispatchFunctionPointer", loadcfg32->GuardXFGTableDispatchFunctionPointer );
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY32, CastGuardOsDeterminedFailureMode )) return;
print_dword( "GuardXFGTableDispatchFuncPtr", loadcfg32->GuardXFGTableDispatchFunctionPointer );
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY32, CastGuardOsDeterminedFailureMode )) goto done;
print_dword( "CastGuardOsDeterminedFailureMode", loadcfg32->CastGuardOsDeterminedFailureMode );
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY32, GuardMemcpyFunctionPointer )) return;
if (size <= offsetof( IMAGE_LOAD_CONFIG_DIRECTORY32, GuardMemcpyFunctionPointer )) goto done;
print_dword( "GuardMemcpyFunctionPointer", loadcfg32->GuardMemcpyFunctionPointer );
}
done:
printf( "\n" );
dump_hybrid_metadata();
}