diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/AbstractProgramLoader.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/AbstractProgramLoader.java index 656f5fa795..0d86795be9 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/AbstractProgramLoader.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/AbstractProgramLoader.java @@ -281,7 +281,7 @@ public abstract class AbstractProgramLoader implements Loader { int id = prog.startTransaction("Set program properties"); boolean success = false; try { - setProgramProperties(prog, settings.provider(), getName()); + setProgramProperties(prog, settings.provider(), getName(), settings.monitor()); try { if (shouldSetImageBase(prog, imageBase)) { prog.setImageBase(imageBase, true); @@ -327,17 +327,25 @@ public abstract class AbstractProgramLoader implements Loader { * @param prog {@link Program} (with active transaction) * @param provider {@link ByteProvider} that the program was created from * @param executableFormatName executable format string + * @param monitor The {@link TaskMonitor} * @throws IOException if error reading from ByteProvider */ public static void setProgramProperties(Program prog, ByteProvider provider, - String executableFormatName) throws IOException { + String executableFormatName, TaskMonitor monitor) throws IOException { prog.setExecutablePath(provider.getAbsolutePath()); if (executableFormatName != null) { prog.setExecutableFormat(executableFormatName); } FSRL fsrl = provider.getFSRL(); - String md5 = - (fsrl != null && fsrl.getMD5() != null) ? fsrl.getMD5() : computeBinaryMD5(provider); + String md5; + monitor.setIndeterminate(true); + if (fsrl != null && fsrl.getMD5() != null) { + md5 = fsrl.getMD5(); + } + else { + monitor.setMessage("Computing MD5..."); + md5 = computeBinaryMD5(provider); + } if (fsrl != null) { if (fsrl.getMD5() == null) { fsrl = fsrl.withMD5(md5); @@ -345,8 +353,12 @@ public abstract class AbstractProgramLoader implements Loader { FSRL.writeToProgramInfo(prog, fsrl); } prog.setExecutableMD5(md5); + + monitor.setMessage("Computing SHA256..."); String sha256 = computeBinarySHA256(provider); prog.setExecutableSHA256(sha256); + + monitor.setIndeterminate(false); } /** diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/LoaderService.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/LoaderService.java index cf6af173ac..963f04bd05 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/LoaderService.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/LoaderService.java @@ -50,7 +50,7 @@ public class LoaderService { for (Loader loader : getAllLoaders()) { if (loaderFilter.test(loader)) { if (!loader.isFallback()) { - tryLoadSpecs(loader, provider, loaderMap); + tryLoadSpecs(loader, provider, loaderMap, monitor); } else { fallback.add(loader); @@ -64,7 +64,7 @@ public class LoaderService { .map(Loader::getName) .anyMatch(Predicate.not(BinaryLoader.BINARY_NAME::equals)); if (!matches) { - fallback.forEach(loader -> tryLoadSpecs(loader, provider, loaderMap)); + fallback.forEach(loader -> tryLoadSpecs(loader, provider, loaderMap, monitor)); } return loaderMap; @@ -90,9 +90,13 @@ public class LoaderService { * @param loader The {@link Loader} to query * @param provider The {@link ByteProvider} to load from * @param loaderMap The {@link LoaderMap} to populate with discovered {@link LoadSpec}s + * @param monitor The {@link TaskMonitor} */ - private static void tryLoadSpecs(Loader loader, ByteProvider provider, LoaderMap loaderMap) { + private static void tryLoadSpecs(Loader loader, ByteProvider provider, LoaderMap loaderMap, + TaskMonitor monitor) { try { + monitor.setMessage("Trying loader: " + loader.getName()); + monitor.setIndeterminate(true); Collection loadSpecs = loader.findSupportedLoadSpecs(provider); if (!CollectionUtils.isBlank(loadSpecs)) { loaderMap.put(loader, loadSpecs); @@ -105,6 +109,9 @@ public class LoaderService { Msg.error(LoaderService.class, "Unexpected Loader exception from " + loader.getName(), e); } + finally { + monitor.setIndeterminate(false); + } } /** diff --git a/Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats/ios/prelink/MachoPrelinkFileSystem.java b/Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats/ios/prelink/MachoPrelinkFileSystem.java index 962c82ec5d..603ec9009e 100644 --- a/Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats/ios/prelink/MachoPrelinkFileSystem.java +++ b/Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats/ios/prelink/MachoPrelinkFileSystem.java @@ -191,7 +191,7 @@ public class MachoPrelinkFileSystem extends GFileSystemBase implements GFileSyst new MessageLog(), monitor); AbstractProgramLoader.setProgramProperties(program, providerWrapper, - MachoLoader.MACH_O_NAME); + MachoLoader.MACH_O_NAME, monitor); program.setExecutablePath(file.getPath()); // override the value set by AbstractProgramLoader.setProgramProperties if (file.equals(systemKextFile)) { diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/FileBytesAdapterV0.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/FileBytesAdapterV0.java index a330d3e4dd..857e31e3b4 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/FileBytesAdapterV0.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/FileBytesAdapterV0.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -172,6 +172,8 @@ class FileBytesAdapterV0 extends FileBytesAdapter { monitor.initialize(size); } + monitor.setMessage("Creating file bytes..."); + int maxBufSize = getMaxBufferSize(); int bufCount = (int) (size / maxBufSize); int sizeLastBuf = (int) (size % maxBufSize);