GP-6577: Fix for CHPE check

This commit is contained in:
Ryan Kurtz
2026-03-20 05:23:29 -04:00
parent 47a65a5e9f
commit c788f2c292
2 changed files with 29 additions and 13 deletions
@@ -29,9 +29,12 @@ import ghidra.util.task.TaskMonitor;
public class ExceptionDataDirectory extends DataDirectory {
private final static String NAME = "IMAGE_DIRECTORY_ENTRY_EXCEPTION";
private LoadConfigDirectory lcDir;
private ImageRuntimeFunctionEntries functionEntries;
ExceptionDataDirectory(NTHeader ntHeader, BinaryReader reader) throws IOException {
ExceptionDataDirectory(NTHeader ntHeader, BinaryReader reader, LoadConfigDirectory lcDir)
throws IOException {
this.lcDir = lcDir;
processDataDirectory(ntHeader, reader);
}
@@ -52,7 +55,7 @@ public class ExceptionDataDirectory extends DataDirectory {
try {
FileHeader fileHeader = ntHeader.getFileHeader();
boolean isChpe = isChpe(fileHeader);
boolean isChpe = lcDir != null && lcDir.getChpeMetadataPointer() != 0;
if (fileHeader.isX86() && !isChpe) {
functionEntries = new ImageRuntimeFunctionEntries_X86(reader, size, ntHeader);
}
@@ -90,14 +93,4 @@ public class ExceptionDataDirectory extends DataDirectory {
functionEntries.markup(program, addr);
}
}
private boolean isChpe(FileHeader fileHeader) {
DataDirectory[] dirs = ntHeader.getOptionalHeader().getDataDirectories();
if (dirs.length > OptionalHeader.IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG) {
LoadConfigDataDirectory dataDir =
(LoadConfigDataDirectory) dirs[OptionalHeader.IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG];
return dataDir.getLoadConfigDirectory().getChpeMetadataPointer() != 0;
}
return false;
}
}
@@ -425,7 +425,8 @@ public class OptionalHeader implements StructConverter {
monitor.setMessage("Parsing exceptions...");
try {
dataDirectory[ndata] = new ExceptionDataDirectory(ntHeader, reader);
dataDirectory[ndata] = new ExceptionDataDirectory(ntHeader, reader,
processLoadConfig(ntHeader, log, monitor));
}
catch (RuntimeException re) {
if (PortableExecutable.DEBUG) {
@@ -881,6 +882,28 @@ public class OptionalHeader implements StructConverter {
return dataDirectory;
}
/**
* Parses the {@link LoadConfigDataDirectory} and returns its {@link LoadConfigDirectory}
*
* @param nt The {@link NTHeader}
* @param log The log
* @param monitor The monitor
* @return the parsed {@link LoadConfigDirectory}
* @throws IOException if an IO-related error occurred
*/
public LoadConfigDirectory processLoadConfig(NTHeader nt, MessageLog log, TaskMonitor monitor)
throws IOException {
if (IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG >= numberOfRvaAndSizes) {
return null;
}
BinaryReader r = reader.clone(startOfDataDirs + IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG * 8);
LoadConfigDataDirectory dataDir = new LoadConfigDataDirectory(nt, r);
return dataDir.parse() ? dataDir.getLoadConfigDirectory() : null;
}
@Override
public DataType toDataType() throws DuplicateNameException {
StructureDataType ddstruct = new StructureDataType(DataDirectory.TITLE, 0);