GT-3076 PDB Do not automatically include path: check-in and certify

This commit is contained in:
ghizard 2019-08-12 15:32:18 -04:00
parent 6da0d9340d
commit 99a916e1ba
6 changed files with 162 additions and 99 deletions

View file

@ -46,6 +46,16 @@ public class PdbAnalyzer extends AbstractAnalyzer {
private String symbolsRepositoryPath = SYMBOLPATH_OPTION_DEFAULT_VALUE; private String symbolsRepositoryPath = SYMBOLPATH_OPTION_DEFAULT_VALUE;
//==============================================================================================
// Include the PE-Header-Specified PDB path for searching for appropriate PDB file.
private static final String OPTION_NAME_INCLUDE_PE_PDB_PATH =
"Unsafe: Include PE PDB Path in PDB Search";
private static final String OPTION_DESCRIPTION_INCLUDE_PE_PDB_PATH =
"If checked, specifically searching for PDB in PE-Header-Specified Location.";
private boolean includePeSpecifiedPdbPath = false;
//==============================================================================================
public PdbAnalyzer() { public PdbAnalyzer() {
super(NAME, DESCRIPTION, AnalyzerType.BYTE_ANALYZER); super(NAME, DESCRIPTION, AnalyzerType.BYTE_ANALYZER);
setDefaultEnablement(true); setDefaultEnablement(true);
@ -60,7 +70,7 @@ public class PdbAnalyzer extends AbstractAnalyzer {
return true; return true;
} }
File pdb = lookForPdb(program, log); File pdb = lookForPdb(program, includePeSpecifiedPdbPath, log);
if (pdb == null) { if (pdb == null) {
return false; return false;
@ -74,13 +84,13 @@ public class PdbAnalyzer extends AbstractAnalyzer {
// object existence indicates missing PDB has already been reported // object existence indicates missing PDB has already been reported
} }
File lookForPdb(Program program, MessageLog log) { File lookForPdb(Program program, boolean includePeSpecifiedPdbPath, MessageLog log) {
String message = ""; String message = "";
File pdb; File pdb;
try { try {
pdb = PdbParser.findPDB(program, symbolsRepositoryPath); pdb = PdbParser.findPDB(program, includePeSpecifiedPdbPath, symbolsRepositoryPath);
if (pdb == null) { if (pdb == null) {
@ -182,6 +192,9 @@ public class PdbAnalyzer extends AbstractAnalyzer {
options.registerOption(SYMBOLPATH_OPTION_NAME, SYMBOLPATH_OPTION_DEFAULT_VALUE, null, options.registerOption(SYMBOLPATH_OPTION_NAME, SYMBOLPATH_OPTION_DEFAULT_VALUE, null,
SYMBOLPATH_OPTION_DESCRIPTION); SYMBOLPATH_OPTION_DESCRIPTION);
} }
options.registerOption(OPTION_NAME_INCLUDE_PE_PDB_PATH, includePeSpecifiedPdbPath, null,
OPTION_DESCRIPTION_INCLUDE_PE_PDB_PATH);
} }
@Override @Override
@ -192,6 +205,9 @@ public class PdbAnalyzer extends AbstractAnalyzer {
Preferences.setProperty(PdbParser.PDB_STORAGE_PROPERTY, symbolPath); Preferences.setProperty(PdbParser.PDB_STORAGE_PROPERTY, symbolPath);
Preferences.store(); Preferences.store();
includePeSpecifiedPdbPath =
options.getBoolean(OPTION_NAME_INCLUDE_PE_PDB_PATH, includePeSpecifiedPdbPath);
} }
public void setSymbolsRepositoryPath(String symbolPath) { public void setSymbolsRepositoryPath(String symbolPath) {

View file

@ -73,7 +73,7 @@ class ApplyFunctions {
cmd.applyTo(program, monitor); cmd.applyTo(program, monitor);
} }
pdbParser.createSymbol(address, name, true, log, monitor); pdbParser.createSymbol(address, name, true, log);
Function function = listing.getFunctionAt(address); Function function = listing.getFunctionAt(address);
if (function == null) { if (function == null) {

View file

@ -117,7 +117,7 @@ class ApplySymbols {
// Don't create label for Data since a separate symbol should also exist with a better name // Don't create label for Data since a separate symbol should also exist with a better name
if (!"Data".equals(tag) && if (!"Data".equals(tag) &&
!pdbParser.createSymbol(address, name, forcePrimary, log, monitor)) { !pdbParser.createSymbol(address, name, forcePrimary, log)) {
log.appendMsg("Unable to create symbol " + name + " at " + address); log.appendMsg("Unable to create symbol " + name + " at " + address);
} }
@ -149,7 +149,7 @@ class ApplySymbols {
if (name.startsWith(MS_STRING_PREFIX)) { if (name.startsWith(MS_STRING_PREFIX)) {
// TODO: Should this be handled by the demangler instead of here? // TODO: Should this be handled by the demangler instead of here?
boolean isUnicode = isUnicode(name); boolean isUnicode = isUnicode(name);
pdbParser.createString(isUnicode, address, log, monitor); pdbParser.createString(isUnicode, address, log);
} }
//////////// ////////////
// Commented out the following for now, because it appears to be doing things it // Commented out the following for now, because it appears to be doing things it
@ -171,13 +171,13 @@ class ApplySymbols {
// } // }
// } // }
else if (isGuidLabel(name, address, program)) { else if (isGuidLabel(name, address, program)) {
pdbParser.createData(address, new GuidDataType(), log, monitor); pdbParser.createData(address, new GuidDataType(), log);
} }
else if (tag.equals("Data")) { else if (tag.equals("Data")) {
if (datatype.length() == 0) { if (datatype.length() == 0) {
continue; continue;
} }
pdbParser.createData(address, datatype, log, monitor); pdbParser.createData(address, datatype, log);
} }
} }

View file

@ -131,7 +131,7 @@ public class PdbParser {
/** /**
* Parse the PDB file, enforcing pre-conditions and post-conditions. * Parse the PDB file, enforcing pre-conditions and post-conditions.
* *
* @throws IOException if there was a file I/O issue * @throws IOException If an I/O error occurs
* @throws PdbException if there was a problem during processing * @throws PdbException if there was a problem during processing
*/ */
public void parse() throws IOException, PdbException { public void parse() throws IOException, PdbException {
@ -241,6 +241,12 @@ public class PdbParser {
// NTDDK has not been parsed // NTDDK has not been parsed
} }
/**
* Configures the set of command line arguments for the pdb.exe process
* @param noValidation do not ask for GUID/Signature, Age validation
* @return the array of arguments for the command line
* @throws PdbException if the appropriate set of GUID/Signature, Age values is not available
*/
private String[] getCommandLineArray(boolean noValidation) throws PdbException { private String[] getCommandLineArray(boolean noValidation) throws PdbException {
File pdbExeFile; File pdbExeFile;
@ -273,7 +279,7 @@ public class PdbParser {
private void completeDefferedTypeParsing(ApplyDataTypes applyDataTypes, private void completeDefferedTypeParsing(ApplyDataTypes applyDataTypes,
ApplyTypeDefs applyTypeDefs, MessageLog log) throws CancelledException { ApplyTypeDefs applyTypeDefs, MessageLog log) throws CancelledException {
defineClasses(monitor, log); defineClasses(log);
if (applyDataTypes != null) { if (applyDataTypes != null) {
applyDataTypes.buildDataTypes(monitor); applyDataTypes.buildDataTypes(monitor);
@ -304,9 +310,6 @@ public class PdbParser {
checkPdbLoaded(); checkPdbLoaded();
if (monitor == null) {
monitor = TaskMonitor.DUMMY;
}
errHandler.setMessageLog(log); errHandler.setMessageLog(log);
Msg.debug(this, "Found PDB for " + program.getName()); Msg.debug(this, "Found PDB for " + program.getName());
try { try {
@ -423,7 +426,7 @@ public class PdbParser {
} }
} }
private void defineClasses(TaskMonitor monitor, MessageLog log) throws CancelledException { private void defineClasses(MessageLog log) throws CancelledException {
// create namespace and classes in an ordered fashion use tree map // create namespace and classes in an ordered fashion use tree map
monitor.initialize(namespaceMap.size()); monitor.initialize(namespaceMap.size());
for (SymbolPath path : namespaceMap.keySet()) { for (SymbolPath path : namespaceMap.keySet()) {
@ -500,8 +503,8 @@ public class PdbParser {
* age match the program's GUID/Signature and age. * age match the program's GUID/Signature and age.
* *
* @param skipValidation true if we should skip checking that GUID/Signature and age match * @param skipValidation true if we should skip checking that GUID/Signature and age match
* @throws PdbException * @throws PdbException If issue running the pdb.exe process
* @throws IOException * @throws IOException If an I/O error occurs
*/ */
private void processPdbContents(boolean skipValidation) throws PdbException, IOException { private void processPdbContents(boolean skipValidation) throws PdbException, IOException {
InputStream in = null; InputStream in = null;
@ -555,8 +558,8 @@ public class PdbParser {
* Check to see if GUID and age in XML file matches GUID/Signature and age of binary * Check to see if GUID and age in XML file matches GUID/Signature and age of binary
* *
* @param in InputStream for XML file * @param in InputStream for XML file
* @throws IOException * @throws IOException If an I/O error occurs
* @throws PdbException * @throws PdbException If error parsing the PDB.XML data
*/ */
private void verifyPdbSignature(InputStream in) throws IOException, PdbException { private void verifyPdbSignature(InputStream in) throws IOException, PdbException {
@ -648,7 +651,7 @@ public class PdbParser {
* Translate signature to GUID form. A signature is usually 8 characters long. A GUID * Translate signature to GUID form. A signature is usually 8 characters long. A GUID
* has 32 characters and its subparts are separated by '-' characters. * has 32 characters and its subparts are separated by '-' characters.
* *
* @param pdbSignature * @param pdbSignature signature for conversion
* @return reformatted String * @return reformatted String
*/ */
private String reformatSignatureToGuidForm(String pdbSignature) { private String reformatSignatureToGuidForm(String pdbSignature) {
@ -740,13 +743,12 @@ public class PdbParser {
dataMgr); dataMgr);
} }
void createString(boolean isUnicode, Address address, MessageLog log, TaskMonitor monitor) { void createString(boolean isUnicode, Address address, MessageLog log) {
DataType dataType = isUnicode ? new UnicodeDataType() : new StringDataType(); DataType dataType = isUnicode ? new UnicodeDataType() : new StringDataType();
createData(address, dataType, log, monitor); createData(address, dataType, log);
} }
void createData(Address address, String datatype, MessageLog log, TaskMonitor monitor) void createData(Address address, String datatype, MessageLog log) throws CancelledException {
throws CancelledException {
WrappedDataType wrappedDt = getDataTypeParser().findDataType(datatype); WrappedDataType wrappedDt = getDataTypeParser().findDataType(datatype);
if (wrappedDt == null) { if (wrappedDt == null) {
log.appendMsg("Error: Failed to resolve datatype " + datatype + " at " + address); log.appendMsg("Error: Failed to resolve datatype " + datatype + " at " + address);
@ -755,11 +757,11 @@ public class PdbParser {
Msg.debug(this, "Did not apply zero length array data " + datatype + " at " + address); Msg.debug(this, "Did not apply zero length array data " + datatype + " at " + address);
} }
else { else {
createData(address, wrappedDt.getDataType(), log, monitor); createData(address, wrappedDt.getDataType(), log);
} }
} }
void createData(Address address, DataType dataType, MessageLog log, TaskMonitor monitor) { void createData(Address address, DataType dataType, MessageLog log) {
DumbMemBufferImpl memBuffer = new DumbMemBufferImpl(program.getMemory(), address); DumbMemBufferImpl memBuffer = new DumbMemBufferImpl(program.getMemory(), address);
DataTypeInstance dti = DataTypeInstance.getDataTypeInstance(dataType, memBuffer); DataTypeInstance dti = DataTypeInstance.getDataTypeInstance(dataType, memBuffer);
if (dti == null) { if (dti == null) {
@ -767,12 +769,12 @@ public class PdbParser {
"Error: Failed to apply datatype " + dataType.getName() + " at " + address); "Error: Failed to apply datatype " + dataType.getName() + " at " + address);
} }
else { else {
createData(address, dti.getDataType(), dti.getLength(), log, monitor); createData(address, dti.getDataType(), dti.getLength(), log);
} }
} }
private void createData(Address address, DataType dataType, int dataTypeLength, MessageLog log, private void createData(Address address, DataType dataType, int dataTypeLength,
TaskMonitor monitor) { MessageLog log) {
// Ensure that we do not clear previously established code and data // Ensure that we do not clear previously established code and data
Data existingData = null; Data existingData = null;
@ -924,7 +926,7 @@ public class PdbParser {
} }
boolean createSymbol(Address address, String symbolPathString, boolean forcePrimary, boolean createSymbol(Address address, String symbolPathString, boolean forcePrimary,
MessageLog log, TaskMonitor monitor) throws CancelledException { MessageLog log) {
try { try {
Namespace namespace = program.getGlobalNamespace(); Namespace namespace = program.getGlobalNamespace();
@ -992,7 +994,7 @@ public class PdbParser {
* Get the category path associated with the namespace qualified data type name * Get the category path associated with the namespace qualified data type name
* @param namespaceQualifiedDataTypeName data type name * @param namespaceQualifiedDataTypeName data type name
* @param addPdbRoot true if PDB root category should be used, otherwise it will be omitted * @param addPdbRoot true if PDB root category should be used, otherwise it will be omitted
* @return * @return the category path
*/ */
CategoryPath getCategory(String namespaceQualifiedDataTypeName, boolean addPdbRoot) { CategoryPath getCategory(String namespaceQualifiedDataTypeName, boolean addPdbRoot) {
String[] names = namespaceQualifiedDataTypeName.split(Namespace.NAMESPACE_DELIMITER); String[] names = namespaceQualifiedDataTypeName.split(Namespace.NAMESPACE_DELIMITER);
@ -1047,12 +1049,12 @@ public class PdbParser {
* @throws PdbException if there was a problem with the PDB attributes * @throws PdbException if there was a problem with the PDB attributes
*/ */
public static File findPDB(Program program) throws PdbException { public static File findPDB(Program program) throws PdbException {
return findPDB(getPdbAttributes(program), null, null); return findPDB(getPdbAttributes(program), false, null, null);
} }
/** /**
* Determine if the PDB has previously been loaded for the specified program. * Determine if the PDB has previously been loaded for the specified program.
* @param program * @param program program for which to find a matching PDB
* @return true if PDB has already been loaded * @return true if PDB has already been loaded
*/ */
public static boolean isAlreadyLoaded(Program program) { public static boolean isAlreadyLoaded(Program program) {
@ -1064,12 +1066,15 @@ public class PdbParser {
* location where symbols are stored. * location where symbols are stored.
* *
* @param program program for which to find a matching PDB * @param program program for which to find a matching PDB
* @param includePeSpecifiedPdbPath to also check the PE-header-specified PDB path
* @param symbolsRepositoryPath location where downloaded symbols are stored * @param symbolsRepositoryPath location where downloaded symbols are stored
* @return matching PDB for program, or null * @return matching PDB for program, or null
* @throws PdbException if there was a problem with the PDB attributes * @throws PdbException if there was a problem with the PDB attributes
*/ */
public static File findPDB(Program program, String symbolsRepositoryPath) throws PdbException { public static File findPDB(Program program, boolean includePeSpecifiedPdbPath,
return findPDB(getPdbAttributes(program), symbolsRepositoryPath, null); String symbolsRepositoryPath) throws PdbException {
return findPDB(getPdbAttributes(program), includePeSpecifiedPdbPath, symbolsRepositoryPath,
null);
} }
/** /**
@ -1077,13 +1082,15 @@ public class PdbParser {
* type of file to search from (.pdb or .pdb.xml). * type of file to search from (.pdb or .pdb.xml).
* *
* @param pdbAttributes PDB attributes associated with the program * @param pdbAttributes PDB attributes associated with the program
* @param includePeSpecifiedPdbPath to also check the PE-header-specified PDB path
* @param symbolsRepositoryPath location of the local symbols repository (can be null) * @param symbolsRepositoryPath location of the local symbols repository (can be null)
* @param fileType type of file to search for (can be null) * @param fileType type of file to search for (can be null)
* @return matching PDB file (or null, if not found) * @return matching PDB file (or null, if not found)
* @throws PdbException if there was a problem with the PDB attributes * @throws PdbException if there was a problem with the PDB attributes
*/ */
public static File findPDB(PdbProgramAttributes pdbAttributes, String symbolsRepositoryPath, public static File findPDB(PdbProgramAttributes pdbAttributes,
PdbFileType fileType) throws PdbException { boolean includePeSpecifiedPdbPath, String symbolsRepositoryPath, PdbFileType fileType)
throws PdbException {
// Store potential names of PDB files and potential locations of those files, // Store potential names of PDB files and potential locations of those files,
// so that all possible combinations can be searched. // so that all possible combinations can be searched.
@ -1103,7 +1110,7 @@ public class PdbParser {
} }
return checkPathsForPdb(symbolsRepositoryPath, guidSubdirPaths, potentialPdbNames, fileType, return checkPathsForPdb(symbolsRepositoryPath, guidSubdirPaths, potentialPdbNames, fileType,
pdbAttributes); pdbAttributes, includePeSpecifiedPdbPath);
} }
/** /**
@ -1130,16 +1137,16 @@ public class PdbParser {
* @param fileType file type to search for (can be null) * @param fileType file type to search for (can be null)
* @param pdbAttributes PDB attributes associated with the program * @param pdbAttributes PDB attributes associated with the program
* @return matching PDB file, if found (else null) * @return matching PDB file, if found (else null)
* @throws PdbException
*/ */
private static File checkPathsForPdb(String symbolsRepositoryPath, Set<String> guidSubdirPaths, private static File checkPathsForPdb(String symbolsRepositoryPath, Set<String> guidSubdirPaths,
List<String> potentialPdbNames, PdbFileType fileType, List<String> potentialPdbNames, PdbFileType fileType,
PdbProgramAttributes pdbAttributes) { PdbProgramAttributes pdbAttributes, boolean includePeSpecifiedPdbPath) {
File foundPdb = null; File foundPdb = null;
Set<File> symbolsRepoPaths = Set<File> symbolsRepoPaths =
getSymbolsRepositoryPaths(symbolsRepositoryPath, guidSubdirPaths); getSymbolsRepositoryPaths(symbolsRepositoryPath, guidSubdirPaths);
Set<File> predefinedPaths = getPredefinedPaths(guidSubdirPaths, pdbAttributes); Set<File> predefinedPaths =
getPredefinedPaths(guidSubdirPaths, pdbAttributes, includePeSpecifiedPdbPath);
boolean fileTypeSpecified = (fileType != null), checkForXml; boolean fileTypeSpecified = (fileType != null), checkForXml;
// If the file type is specified, look for that type of file only. // If the file type is specified, look for that type of file only.
@ -1216,11 +1223,11 @@ public class PdbParser {
// Get list of "paths we know about" to search for PDBs // Get list of "paths we know about" to search for PDBs
private static Set<File> getPredefinedPaths(Set<String> guidSubdirPaths, private static Set<File> getPredefinedPaths(Set<String> guidSubdirPaths,
PdbProgramAttributes pdbAttributes) { PdbProgramAttributes pdbAttributes, boolean includePeSpecifiedPdbPath) {
Set<File> predefinedPaths = new LinkedHashSet<>(); Set<File> predefinedPaths = new LinkedHashSet<>();
getPathsFromAttributes(pdbAttributes, predefinedPaths); getPathsFromAttributes(pdbAttributes, includePeSpecifiedPdbPath, predefinedPaths);
getWindowsPaths(guidSubdirPaths, predefinedPaths); getWindowsPaths(guidSubdirPaths, predefinedPaths);
getLibraryPaths(guidSubdirPaths, predefinedPaths); getLibraryPaths(guidSubdirPaths, predefinedPaths);
@ -1265,12 +1272,12 @@ public class PdbParser {
} }
private static void getPathsFromAttributes(PdbProgramAttributes pdbAttributes, private static void getPathsFromAttributes(PdbProgramAttributes pdbAttributes,
Set<File> predefinedPaths) { boolean includePeSpecifiedPdbPath, Set<File> predefinedPaths) {
if (pdbAttributes != null) { if (pdbAttributes != null) {
String currentPath = pdbAttributes.getPdbFile(); String currentPath = pdbAttributes.getPdbFile();
if (currentPath != null) { if (currentPath != null && includePeSpecifiedPdbPath) {
File parentDir = new File(currentPath).getParentFile(); File parentDir = new File(currentPath).getParentFile();
if (parentDir != null && parentDir.exists()) { if (parentDir != null && parentDir.exists()) {
@ -1294,10 +1301,10 @@ public class PdbParser {
* Returns the first PDB-type file found. Assumes list of potentialPdbDirs is in the order * Returns the first PDB-type file found. Assumes list of potentialPdbDirs is in the order
* in which the directories should be searched. * in which the directories should be searched.
* *
* @param potentialPdbDirs * @param potentialPdbDirs potential PDB directories
* @param potentialPdbNames * @param potentialPdbNames potential PDB names
* @param findXML - if true, only searches for the .pdb.xml version of the .pdb file * @param findXML - if true, only searches for the .pdb.xml version of the .pdb file
* @return * @return the first file found
*/ */
private static File checkForPDBorXML(Set<File> potentialPdbDirs, List<String> potentialPdbNames, private static File checkForPDBorXML(Set<File> potentialPdbDirs, List<String> potentialPdbNames,
boolean findXML) { boolean findXML) {

View file

@ -19,16 +19,17 @@ import java.io.*;
import java.net.*; import java.net.*;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.StandardCopyOption; import java.nio.file.StandardCopyOption;
import java.util.*; import java.util.List;
import java.util.Properties;
import docking.action.MenuData; import docking.action.MenuData;
import docking.widgets.OptionDialog; import docking.widgets.OptionDialog;
import docking.widgets.filechooser.GhidraFileChooser; import docking.widgets.filechooser.GhidraFileChooser;
import docking.widgets.filechooser.GhidraFileChooserMode;
import ghidra.app.CorePluginPackage; import ghidra.app.CorePluginPackage;
import ghidra.app.context.ProgramActionContext; import ghidra.app.context.ProgramActionContext;
import ghidra.app.context.ProgramContextAction; import ghidra.app.context.ProgramContextAction;
import ghidra.app.plugin.PluginCategoryNames; import ghidra.app.plugin.PluginCategoryNames;
import ghidra.app.script.AskDialog;
import ghidra.app.services.DataTypeManagerService; import ghidra.app.services.DataTypeManagerService;
import ghidra.app.util.bin.format.pdb.*; import ghidra.app.util.bin.format.pdb.*;
import ghidra.app.util.bin.format.pdb.PdbParser.PdbFileType; import ghidra.app.util.bin.format.pdb.PdbParser.PdbFileType;
@ -79,7 +80,8 @@ public class PdbSymbolServerPlugin extends Plugin {
// Store last-selected value(s) for askXxx methods // Store last-selected value(s) for askXxx methods
private static String serverUrl = null; private static String serverUrl = null;
private static File localDir = null; private static File localDir = null;
static PdbFileType fileType = PdbFileType.PDB; private PdbFileType fileType = PdbFileType.PDB;
private boolean includePePdbPath = false;
enum RetrieveFileType { enum RetrieveFileType {
PDB, XML, CAB PDB, XML, CAB
@ -98,6 +100,14 @@ public class PdbSymbolServerPlugin extends Plugin {
urlProperties.setProperty("User-Agent", "Microsoft-Symbol-Server/6.3.9600.17298"); urlProperties.setProperty("User-Agent", "Microsoft-Symbol-Server/6.3.9600.17298");
} }
/**
* Sets the {@link PdbFileType}
* @param fileType the {@link PdbFileType}
*/
public void setPdbFileType(PdbFileType fileType) {
this.fileType = fileType;
}
private void createActions() { private void createActions() {
ProgramContextAction downloadPdbAction = ProgramContextAction downloadPdbAction =
new ProgramContextAction("Download_PDB_File", this.getName()) { new ProgramContextAction("Download_PDB_File", this.getName()) {
@ -172,9 +182,9 @@ public class PdbSymbolServerPlugin extends Plugin {
* *
* @param program program for which to retrieve the PDB file * @param program program for which to retrieve the PDB file
* @return the retrieved PDB file (could be in .pdb or .xml form) * @return the retrieved PDB file (could be in .pdb or .xml form)
* @throws CancelledException * @throws CancelledException upon user cancellation
* @throws IOException * @throws IOException if an I/O issue occurred
* @throws PdbException * @throws PdbException if there was a problem with the PDB attributes
*/ */
private PdbFileAndStatus getPdbFile(Program program) private PdbFileAndStatus getPdbFile(Program program)
throws CancelledException, IOException, PdbException { throws CancelledException, IOException, PdbException {
@ -185,6 +195,9 @@ public class PdbSymbolServerPlugin extends Plugin {
// 1. Ask if user wants .pdb or .pdb.xml file // 1. Ask if user wants .pdb or .pdb.xml file
fileType = askForFileExtension(); fileType = askForFileExtension();
// 1.5 Ask if should search PE-specified PDB path.
includePePdbPath = askIncludePeHeaderPdbPath();
String symbolEnv = System.getenv(symbolServerEnvVar); String symbolEnv = System.getenv(symbolServerEnvVar);
if (symbolEnv != null) { if (symbolEnv != null) {
parseSymbolEnv(symbolEnv); parseSymbolEnv(symbolEnv);
@ -194,8 +207,8 @@ public class PdbSymbolServerPlugin extends Plugin {
localDir = askForLocalStorageLocation(); localDir = askForLocalStorageLocation();
// 3. See if PDB can be found locally // 3. See if PDB can be found locally
File pdbFile = File pdbFile = PdbParser.findPDB(pdbAttributes, includePePdbPath,
PdbParser.findPDB(pdbAttributes, localDir.getAbsolutePath(), fileType); localDir.getAbsolutePath(), fileType);
// 4. If not found locally, ask if it should be retrieved // 4. If not found locally, ask if it should be retrieved
if (pdbFile != null && pdbFile.getName().endsWith(fileType.toString())) { if (pdbFile != null && pdbFile.getName().endsWith(fileType.toString())) {
@ -280,22 +293,35 @@ public class PdbSymbolServerPlugin extends Plugin {
} }
private PdbFileType askForFileExtension() throws CancelledException { private PdbFileType askForFileExtension() throws CancelledException {
//@formatter:off //@formatter:off
AskDialog<PdbFileType> fileTypeDialog = new AskDialog<>( int choice = OptionDialog.showOptionDialog(
null, null,
"pdb or pdb.xml", "pdb or pdb.xml",
"Download a .pdb or .pdb.xml file? (.pdb.xml can be processed on non-Windows systems)", "Download a .pdb or .pdb.xml file? (.pdb.xml can be processed on non-Windows systems)",
AskDialog.STRING, "PDB",
Arrays.asList(PdbFileType.PDB, PdbFileType.XML), "XML");
fileType);
//@formatter:on //@formatter:on
if (fileTypeDialog.isCanceled()) { if (choice == OptionDialog.CANCEL_OPTION) {
throw new CancelledException(); throw new CancelledException();
} }
return (choice == OptionDialog.OPTION_ONE) ? PdbFileType.PDB : PdbFileType.XML;
}
return fileTypeDialog.getChoiceValue(); private boolean askIncludePeHeaderPdbPath() throws CancelledException {
//@formatter:off
int choice = OptionDialog.showOptionDialog(
null,
"PE-specified PDB Path",
"Unsafe: Include PE-specified PDB Path in search for existing PDB",
"Yes",
"No");
//@formatter:on
if (choice == OptionDialog.CANCEL_OPTION) {
throw new CancelledException();
}
return (choice == OptionDialog.OPTION_ONE);
} }
String askForSymbolServerUrl() throws CancelledException { String askForSymbolServerUrl() throws CancelledException {
@ -384,7 +410,7 @@ public class PdbSymbolServerPlugin extends Plugin {
fileChooser.setTitle("Select Location to Save Retrieved File"); fileChooser.setTitle("Select Location to Save Retrieved File");
fileChooser.setApproveButtonText("OK"); fileChooser.setApproveButtonText("OK");
fileChooser.setFileSelectionMode(GhidraFileChooser.DIRECTORIES_ONLY); fileChooser.setFileSelectionMode(GhidraFileChooserMode.DIRECTORIES_ONLY);
chosenDir[0] = fileChooser.getSelectedFile(); chosenDir[0] = fileChooser.getSelectedFile();
if (chosenDir[0] != null) { if (chosenDir[0] != null) {
@ -420,7 +446,8 @@ public class PdbSymbolServerPlugin extends Plugin {
* @param fileUrl URL from which to download the file * @param fileUrl URL from which to download the file
* @param fileDestination location at which to save the downloaded file * @param fileDestination location at which to save the downloaded file
* @return whether download/save succeeded * @return whether download/save succeeded
* @throws IOException * @throws IOException if an I/O issue occurred
* @throws PdbException if issue with PKI certificate
*/ */
boolean retrieveFile(String fileUrl, File fileDestination) throws IOException, PdbException { boolean retrieveFile(String fileUrl, File fileDestination) throws IOException, PdbException {
return retrieveFile(fileUrl, fileDestination, null); return retrieveFile(fileUrl, fileDestination, null);
@ -433,7 +460,8 @@ public class PdbSymbolServerPlugin extends Plugin {
* @param fileDestination location at which to save the downloaded file * @param fileDestination location at which to save the downloaded file
* @param retrieveProperties optional HTTP request header values to be included (may be null) * @param retrieveProperties optional HTTP request header values to be included (may be null)
* @return whether download/save succeeded * @return whether download/save succeeded
* @throws IOException * @throws IOException if an I/O issue occurred
* @throws PdbException if issue with PKI certificate
*/ */
boolean retrieveFile(String fileUrl, File fileDestination, Properties retrieveProperties) boolean retrieveFile(String fileUrl, File fileDestination, Properties retrieveProperties)
throws IOException, PdbException { throws IOException, PdbException {
@ -534,8 +562,8 @@ public class PdbSymbolServerPlugin extends Plugin {
* @param cabFile file to expand/uncompress * @param cabFile file to expand/uncompress
* @param targetFilename file to save uncompressed *.pdb to * @param targetFilename file to save uncompressed *.pdb to
* @return the file that was uncompressed * @return the file that was uncompressed
* @throws PdbException * @throws PdbException if failure with cabinet extraction
* @throws IOException * @throws IOException if issue starting the {@link ProcessBuilder}
*/ */
File uncompressCabFile(File cabFile, String targetFilename) throws PdbException, IOException { File uncompressCabFile(File cabFile, String targetFilename) throws PdbException, IOException {
@ -608,6 +636,18 @@ public class PdbSymbolServerPlugin extends Plugin {
return null; return null;
} }
/**
* Download a file, then move it to its final destination. URL for download is created by
* combining downloadURL and PDB file attributes. Final move destination is also determined
* by the PDB file attributes.
*
* @param pdbAttributes PDB attributes (GUID, age, potential PDB locations, etc.)
* @param downloadUrl Root URL to search for the PDB
* @param saveToLocation Final root directory to save the file
* @return the downloaded and moved file
* @throws IOException if an I/O issue occurred
* @throws PdbException if issue with PKI certificate or cabinet extraction
*/
private File attemptToDownloadPdb(PdbProgramAttributes pdbAttributes, String downloadUrl, private File attemptToDownloadPdb(PdbProgramAttributes pdbAttributes, String downloadUrl,
File saveToLocation) throws PdbException, IOException { File saveToLocation) throws PdbException, IOException {
@ -647,11 +687,10 @@ public class PdbSymbolServerPlugin extends Plugin {
* @param downloadUrl Root URL to search for the PDB * @param downloadUrl Root URL to search for the PDB
* @param tempSaveDirectory Temporary local directory to save downloaded file (which will be moved) * @param tempSaveDirectory Temporary local directory to save downloaded file (which will be moved)
* @param finalSaveDirectory Final root directory to save the file * @param finalSaveDirectory Final root directory to save the file
* @param retrieveXml Whether to retrieve a .pdb.xml file or not * @param retrieveFileType the {@link RetrieveFileType}
* @param retrieveCabFile Whether to retrieve a .cab file or not * @return the downloaded and moved file
* @return the downloaded and moved file * @throws IOException if an I/O issue occurred
* @throws IOException * @throws PdbException if issue with PKI certificate or cabinet extraction
* @throws PdbException
*/ */
File downloadExtractAndMoveFile(PdbProgramAttributes pdbAttributes, String downloadUrl, File downloadExtractAndMoveFile(PdbProgramAttributes pdbAttributes, String downloadUrl,
File tempSaveDirectory, File finalSaveDirectory, RetrieveFileType retrieveFileType) File tempSaveDirectory, File finalSaveDirectory, RetrieveFileType retrieveFileType)

View file

@ -338,7 +338,7 @@ public class PdbParserTest extends AbstractGhidraHeadlessIntegrationTest {
createdFiles = null; createdFiles = null;
createdFiles = createFiles(PdbLocation.SYMBOLS_SUBDIR, PdbXmlLocation.NONE); createdFiles = createFiles(PdbLocation.SYMBOLS_SUBDIR, PdbXmlLocation.NONE);
File pdb = PdbParser.findPDB(testProgram, defaultSymbolsRepoPath); File pdb = PdbParser.findPDB(testProgram, false, defaultSymbolsRepoPath);
// Should not find anything since repo is set to an invalid path // Should not find anything since repo is set to an invalid path
assertNull(pdb); assertNull(pdb);
@ -361,7 +361,7 @@ public class PdbParserTest extends AbstractGhidraHeadlessIntegrationTest {
try { try {
createdFiles = createFiles(PdbLocation.SYMBOLS_SUBDIR, PdbXmlLocation.NONE); createdFiles = createFiles(PdbLocation.SYMBOLS_SUBDIR, PdbXmlLocation.NONE);
File pdb = PdbParser.findPDB(testProgram, symbolsFolder.getAbsolutePath()); File pdb = PdbParser.findPDB(testProgram, false, symbolsFolder.getAbsolutePath());
assertNotNull(pdb); assertNotNull(pdb);
assertEquals(pdbFile.getAbsolutePath(), pdb.getAbsolutePath()); assertEquals(pdbFile.getAbsolutePath(), pdb.getAbsolutePath());
@ -386,7 +386,7 @@ public class PdbParserTest extends AbstractGhidraHeadlessIntegrationTest {
createdFiles = createFiles(PdbLocation.SYMBOLS_SUBDIR, PdbXmlLocation.SAME_AS_PDB); createdFiles = createFiles(PdbLocation.SYMBOLS_SUBDIR, PdbXmlLocation.SAME_AS_PDB);
File pdb = PdbParser.findPDB(testProgram, symbolsFolder.getAbsolutePath()); File pdb = PdbParser.findPDB(testProgram, false, symbolsFolder.getAbsolutePath());
assertNotNull(pdb); assertNotNull(pdb);
@ -414,7 +414,7 @@ public class PdbParserTest extends AbstractGhidraHeadlessIntegrationTest {
try { try {
createdFiles = createFiles(PdbLocation.SYMBOLS_SUBDIR, PdbXmlLocation.OWN_DIR); createdFiles = createFiles(PdbLocation.SYMBOLS_SUBDIR, PdbXmlLocation.OWN_DIR);
File pdb = PdbParser.findPDB(testProgram, symbolsFolder.getAbsolutePath()); File pdb = PdbParser.findPDB(testProgram, false, symbolsFolder.getAbsolutePath());
assertNotNull(pdb); assertNotNull(pdb);
assertEquals(pdb.getAbsolutePath(), pdb.getAbsolutePath()); assertEquals(pdb.getAbsolutePath(), pdb.getAbsolutePath());
@ -439,7 +439,7 @@ public class PdbParserTest extends AbstractGhidraHeadlessIntegrationTest {
createdFiles = createFiles(PdbLocation.SYMBOLS_SUBDIR, PdbXmlLocation.OWN_DIR); createdFiles = createFiles(PdbLocation.SYMBOLS_SUBDIR, PdbXmlLocation.OWN_DIR);
File pdb = PdbParser.findPDB(testProgram, pdbXmlDir.getAbsolutePath()); File pdb = PdbParser.findPDB(testProgram, false, pdbXmlDir.getAbsolutePath());
assertNotNull(pdb); assertNotNull(pdb);
@ -467,7 +467,7 @@ public class PdbParserTest extends AbstractGhidraHeadlessIntegrationTest {
try { try {
createdFiles = createFiles(PdbLocation.SYMBOLS_NO_SUBDIR, PdbXmlLocation.NONE); createdFiles = createFiles(PdbLocation.SYMBOLS_NO_SUBDIR, PdbXmlLocation.NONE);
File pdb = PdbParser.findPDB(testProgram, symbolsFolder.getAbsolutePath()); File pdb = PdbParser.findPDB(testProgram, false, symbolsFolder.getAbsolutePath());
assertNotNull(pdb); assertNotNull(pdb);
assertEquals(pdbFile.getAbsolutePath(), pdb.getAbsolutePath()); assertEquals(pdbFile.getAbsolutePath(), pdb.getAbsolutePath());
@ -491,7 +491,7 @@ public class PdbParserTest extends AbstractGhidraHeadlessIntegrationTest {
createdFiles = createFiles(PdbLocation.SYMBOLS_NO_SUBDIR, PdbXmlLocation.NONE); createdFiles = createFiles(PdbLocation.SYMBOLS_NO_SUBDIR, PdbXmlLocation.NONE);
File pdb = PdbParser.findPDB(testProgram, pdbXmlDir.getAbsolutePath()); File pdb = PdbParser.findPDB(testProgram, false, pdbXmlDir.getAbsolutePath());
// Should not find anything since repo is set to an invalid path // Should not find anything since repo is set to an invalid path
assertNull(pdb); assertNull(pdb);
@ -512,7 +512,7 @@ public class PdbParserTest extends AbstractGhidraHeadlessIntegrationTest {
createdFiles = createFiles(PdbLocation.SYMBOLS_NO_SUBDIR, PdbXmlLocation.SAME_AS_PDB); createdFiles = createFiles(PdbLocation.SYMBOLS_NO_SUBDIR, PdbXmlLocation.SAME_AS_PDB);
File pdb = PdbParser.findPDB(testProgram, symbolsFolder.getAbsolutePath()); File pdb = PdbParser.findPDB(testProgram, false, symbolsFolder.getAbsolutePath());
assertNotNull(pdb); assertNotNull(pdb);
@ -540,7 +540,7 @@ public class PdbParserTest extends AbstractGhidraHeadlessIntegrationTest {
try { try {
createdFiles = createFiles(PdbLocation.SYMBOLS_NO_SUBDIR, PdbXmlLocation.OWN_DIR); createdFiles = createFiles(PdbLocation.SYMBOLS_NO_SUBDIR, PdbXmlLocation.OWN_DIR);
File pdb = PdbParser.findPDB(testProgram, symbolsFolder.getAbsolutePath()); File pdb = PdbParser.findPDB(testProgram, false, symbolsFolder.getAbsolutePath());
assertNotNull(pdb); assertNotNull(pdb);
assertEquals(pdbFile.getAbsolutePath(), pdb.getAbsolutePath()); assertEquals(pdbFile.getAbsolutePath(), pdb.getAbsolutePath());
@ -565,7 +565,7 @@ public class PdbParserTest extends AbstractGhidraHeadlessIntegrationTest {
createdFiles = createFiles(PdbLocation.SYMBOLS_NO_SUBDIR, PdbXmlLocation.OWN_DIR); createdFiles = createFiles(PdbLocation.SYMBOLS_NO_SUBDIR, PdbXmlLocation.OWN_DIR);
File pdb = PdbParser.findPDB(testProgram, pdbXmlDir.getAbsolutePath()); File pdb = PdbParser.findPDB(testProgram, false, pdbXmlDir.getAbsolutePath());
assertNotNull(pdb); assertNotNull(pdb);
@ -593,7 +593,7 @@ public class PdbParserTest extends AbstractGhidraHeadlessIntegrationTest {
try { try {
createdFiles = createFiles(PdbLocation.SAME_AS_EXE_SUBDIR, PdbXmlLocation.NONE); createdFiles = createFiles(PdbLocation.SAME_AS_EXE_SUBDIR, PdbXmlLocation.NONE);
File pdb = PdbParser.findPDB(testProgram, pdbFile.getParent()); File pdb = PdbParser.findPDB(testProgram, false, pdbFile.getParent());
assertNotNull(pdb); assertNotNull(pdb);
assertEquals(pdbFile.getAbsolutePath(), pdb.getAbsolutePath()); assertEquals(pdbFile.getAbsolutePath(), pdb.getAbsolutePath());
@ -617,7 +617,7 @@ public class PdbParserTest extends AbstractGhidraHeadlessIntegrationTest {
createdFiles = createFiles(PdbLocation.SAME_AS_EXE_SUBDIR, PdbXmlLocation.SAME_AS_PDB); createdFiles = createFiles(PdbLocation.SAME_AS_EXE_SUBDIR, PdbXmlLocation.SAME_AS_PDB);
File pdb = PdbParser.findPDB(testProgram, defaultSymbolsRepoPath); File pdb = PdbParser.findPDB(testProgram, false, defaultSymbolsRepoPath);
// Should not find anything since repo is set to an invalid path // Should not find anything since repo is set to an invalid path
assertNull(pdb); assertNull(pdb);
@ -638,7 +638,7 @@ public class PdbParserTest extends AbstractGhidraHeadlessIntegrationTest {
createdFiles = createFiles(PdbLocation.SAME_AS_EXE_SUBDIR, PdbXmlLocation.SAME_AS_PDB); createdFiles = createFiles(PdbLocation.SAME_AS_EXE_SUBDIR, PdbXmlLocation.SAME_AS_PDB);
File pdb = PdbParser.findPDB(testProgram, pdbFile.getParent()); File pdb = PdbParser.findPDB(testProgram, false, pdbFile.getParent());
assertNotNull(pdb); assertNotNull(pdb);
@ -666,7 +666,7 @@ public class PdbParserTest extends AbstractGhidraHeadlessIntegrationTest {
try { try {
createdFiles = createFiles(PdbLocation.SAME_AS_EXE_SUBDIR, PdbXmlLocation.OWN_DIR); createdFiles = createFiles(PdbLocation.SAME_AS_EXE_SUBDIR, PdbXmlLocation.OWN_DIR);
File pdb = PdbParser.findPDB(testProgram, pdbFile.getParent()); File pdb = PdbParser.findPDB(testProgram, false, pdbFile.getParent());
assertNotNull(pdb); assertNotNull(pdb);
assertEquals(pdbFile.getAbsolutePath(), pdb.getAbsolutePath()); assertEquals(pdbFile.getAbsolutePath(), pdb.getAbsolutePath());
@ -691,7 +691,7 @@ public class PdbParserTest extends AbstractGhidraHeadlessIntegrationTest {
createdFiles = createFiles(PdbLocation.SAME_AS_EXE_SUBDIR, PdbXmlLocation.OWN_DIR); createdFiles = createFiles(PdbLocation.SAME_AS_EXE_SUBDIR, PdbXmlLocation.OWN_DIR);
File pdb = PdbParser.findPDB(testProgram, pdbXmlFile.getParent()); File pdb = PdbParser.findPDB(testProgram, false, pdbXmlFile.getParent());
assertNotNull(pdb); assertNotNull(pdb);
@ -722,7 +722,7 @@ public class PdbParserTest extends AbstractGhidraHeadlessIntegrationTest {
try { try {
createdFiles = createFiles(PdbLocation.SAME_AS_EXE_NO_SUBDIR, PdbXmlLocation.NONE); createdFiles = createFiles(PdbLocation.SAME_AS_EXE_NO_SUBDIR, PdbXmlLocation.NONE);
File pdb = PdbParser.findPDB(testProgram, defaultSymbolsRepoPath); File pdb = PdbParser.findPDB(testProgram, false, defaultSymbolsRepoPath);
assertNotNull(pdb); assertNotNull(pdb);
assertEquals(pdbFile.getAbsolutePath(), pdb.getAbsolutePath()); assertEquals(pdbFile.getAbsolutePath(), pdb.getAbsolutePath());
@ -748,7 +748,7 @@ public class PdbParserTest extends AbstractGhidraHeadlessIntegrationTest {
try { try {
createdFiles = createFiles(PdbLocation.SAME_AS_EXE_NO_SUBDIR, PdbXmlLocation.NONE); createdFiles = createFiles(PdbLocation.SAME_AS_EXE_NO_SUBDIR, PdbXmlLocation.NONE);
File pdb = PdbParser.findPDB(testProgram, pdbFile.getParent()); File pdb = PdbParser.findPDB(testProgram, false, pdbFile.getParent());
assertNotNull(pdb); assertNotNull(pdb);
assertEquals(pdbFile.getAbsolutePath(), pdb.getAbsolutePath()); assertEquals(pdbFile.getAbsolutePath(), pdb.getAbsolutePath());
@ -777,7 +777,7 @@ public class PdbParserTest extends AbstractGhidraHeadlessIntegrationTest {
try { try {
createdFiles = createFiles(PdbLocation.SAME_AS_EXE_NO_SUBDIR, PdbXmlLocation.NONE); createdFiles = createFiles(PdbLocation.SAME_AS_EXE_NO_SUBDIR, PdbXmlLocation.NONE);
File pdb = PdbParser.findPDB(testProgram, pdbXmlDir.getAbsolutePath()); File pdb = PdbParser.findPDB(testProgram, false, pdbXmlDir.getAbsolutePath());
assertNotNull(pdb); assertNotNull(pdb);
assertEquals(pdbFile.getAbsolutePath(), pdb.getAbsolutePath()); assertEquals(pdbFile.getAbsolutePath(), pdb.getAbsolutePath());
@ -805,7 +805,7 @@ public class PdbParserTest extends AbstractGhidraHeadlessIntegrationTest {
createdFiles = createFiles(PdbLocation.SAME_AS_EXE_NO_SUBDIR, PdbXmlLocation.SAME_AS_PDB); createdFiles = createFiles(PdbLocation.SAME_AS_EXE_NO_SUBDIR, PdbXmlLocation.SAME_AS_PDB);
File pdb = PdbParser.findPDB(testProgram, defaultSymbolsRepoPath); File pdb = PdbParser.findPDB(testProgram, false, defaultSymbolsRepoPath);
assertNotNull(pdb); assertNotNull(pdb);
@ -832,7 +832,7 @@ public class PdbParserTest extends AbstractGhidraHeadlessIntegrationTest {
createdFiles = createFiles(PdbLocation.SAME_AS_EXE_NO_SUBDIR, PdbXmlLocation.SAME_AS_PDB); createdFiles = createFiles(PdbLocation.SAME_AS_EXE_NO_SUBDIR, PdbXmlLocation.SAME_AS_PDB);
File pdb = PdbParser.findPDB(testProgram, pdbFile.getParent()); File pdb = PdbParser.findPDB(testProgram, false, pdbFile.getParent());
assertNotNull(pdb); assertNotNull(pdb);
@ -860,7 +860,7 @@ public class PdbParserTest extends AbstractGhidraHeadlessIntegrationTest {
try { try {
createdFiles = createFiles(PdbLocation.SAME_AS_EXE_NO_SUBDIR, PdbXmlLocation.OWN_DIR); createdFiles = createFiles(PdbLocation.SAME_AS_EXE_NO_SUBDIR, PdbXmlLocation.OWN_DIR);
File pdb = PdbParser.findPDB(testProgram, defaultSymbolsRepoPath); File pdb = PdbParser.findPDB(testProgram, false, defaultSymbolsRepoPath);
assertNotNull(pdb); assertNotNull(pdb);
assertEquals(pdbFile.getAbsolutePath(), pdb.getAbsolutePath()); assertEquals(pdbFile.getAbsolutePath(), pdb.getAbsolutePath());
@ -886,7 +886,8 @@ public class PdbParserTest extends AbstractGhidraHeadlessIntegrationTest {
try { try {
createdFiles = createFiles(PdbLocation.SAME_AS_EXE_NO_SUBDIR, PdbXmlLocation.OWN_DIR); createdFiles = createFiles(PdbLocation.SAME_AS_EXE_NO_SUBDIR, PdbXmlLocation.OWN_DIR);
File pdb = PdbParser.findPDB(testProgram, pdbFile.getParentFile().getAbsolutePath()); File pdb =
PdbParser.findPDB(testProgram, false, pdbFile.getParentFile().getAbsolutePath());
assertNotNull(pdb); assertNotNull(pdb);
assertEquals(pdbFile.getAbsolutePath(), pdb.getAbsolutePath()); assertEquals(pdbFile.getAbsolutePath(), pdb.getAbsolutePath());
@ -914,7 +915,7 @@ public class PdbParserTest extends AbstractGhidraHeadlessIntegrationTest {
createdFiles = createFiles(PdbLocation.SAME_AS_EXE_NO_SUBDIR, PdbXmlLocation.OWN_DIR); createdFiles = createFiles(PdbLocation.SAME_AS_EXE_NO_SUBDIR, PdbXmlLocation.OWN_DIR);
File pdb = PdbParser.findPDB(testProgram, pdbXmlDir.getAbsolutePath()); File pdb = PdbParser.findPDB(testProgram, false, pdbXmlDir.getAbsolutePath());
assertNotNull(pdb); assertNotNull(pdb);
@ -941,7 +942,7 @@ public class PdbParserTest extends AbstractGhidraHeadlessIntegrationTest {
createdFiles = createFiles(PdbLocation.NONE, PdbXmlLocation.NONE); createdFiles = createFiles(PdbLocation.NONE, PdbXmlLocation.NONE);
File pdb = PdbParser.findPDB(testProgram, defaultSymbolsRepoPath); File pdb = PdbParser.findPDB(testProgram, false, defaultSymbolsRepoPath);
assertNull(pdb); assertNull(pdb);
} }
@ -961,7 +962,7 @@ public class PdbParserTest extends AbstractGhidraHeadlessIntegrationTest {
createdFiles = createFiles(PdbLocation.NONE, PdbXmlLocation.OWN_DIR); createdFiles = createFiles(PdbLocation.NONE, PdbXmlLocation.OWN_DIR);
File pdb = PdbParser.findPDB(testProgram, defaultSymbolsRepoPath); File pdb = PdbParser.findPDB(testProgram, false, defaultSymbolsRepoPath);
assertNull(pdb); assertNull(pdb);
} }
@ -981,7 +982,7 @@ public class PdbParserTest extends AbstractGhidraHeadlessIntegrationTest {
createdFiles = createFiles(PdbLocation.NONE, PdbXmlLocation.OWN_DIR); createdFiles = createFiles(PdbLocation.NONE, PdbXmlLocation.OWN_DIR);
File pdb = PdbParser.findPDB(testProgram, pdbXmlDir.getAbsolutePath()); File pdb = PdbParser.findPDB(testProgram, false, pdbXmlDir.getAbsolutePath());
assertNotNull(pdb); assertNotNull(pdb);
@ -1061,7 +1062,7 @@ public class PdbParserTest extends AbstractGhidraHeadlessIntegrationTest {
buildPdbXml(); buildPdbXml();
File pdb = PdbParser.findPDB(testProgram, pdbXmlDir.getAbsolutePath()); File pdb = PdbParser.findPDB(testProgram, false, pdbXmlDir.getAbsolutePath());
AutoAnalysisManager mgr = AutoAnalysisManager.getAnalysisManager(testProgram); AutoAnalysisManager mgr = AutoAnalysisManager.getAnalysisManager(testProgram);
DataTypeManagerService dataTypeManagerService = mgr.getDataTypeManagerService(); DataTypeManagerService dataTypeManagerService = mgr.getDataTypeManagerService();