@Override
	public void load(ByteProvider provider, LoadSpec loadSpec, List<Option> options, Program prog,
			TaskMonitor monitor, MessageLog log) throws IOException, CancelledException {

		if (monitor.isCancelled()) {
			return;
		}
		monitor.setMessage("Processing new executable...");

		initVars();

		FileBytes fileBytes = MemoryBlockUtils.createFileBytes(prog, provider, monitor);
		SegmentedAddressSpace space =
			(SegmentedAddressSpace) prog.getAddressFactory().getDefaultAddressSpace();
		NewExecutable ne = new NewExecutable(provider, space.getAddress(SEGMENT_START, 0));
		WindowsHeader wh = ne.getWindowsHeader();
		InformationBlock ib = wh.getInformationBlock();
		SegmentTable st = wh.getSegmentTable();
		ResourceTable rt = wh.getResourceTable();
		EntryTable et = wh.getEntryTable();
		ResidentNameTable rnt = wh.getResidentNameTable();
		NonResidentNameTable nrnt = wh.getNonResidentNameTable();
		ImportedNameTable imp = wh.getImportedNameTable();
		ModuleReferenceTable mrt = wh.getModuleReferenceTable();

		Listing listing = prog.getListing();
		SymbolTable symbolTable = prog.getSymbolTable();
		Memory memory = prog.getMemory();
		ProgramContext context = prog.getProgramContext();
		RelocationTable relocTable = prog.getRelocationTable();

		if (monitor.isCancelled()) {
			return;
		}
		monitor.setMessage("Processing segment table...");
		processSegmentTable(log, ib, st, space, prog, context, fileBytes, monitor);
		if (prog.getMemory().isEmpty()) {
			Msg.error(this, "Empty memory for " + prog);
			return;
		}

		if (monitor.isCancelled()) {
			return;
		}
		monitor.setMessage("Processing resource table...");
		processResourceTable(log, prog, rt, space, fileBytes, monitor);

		if (monitor.isCancelled()) {
			return;
		}
		monitor.setMessage("Processing module reference table...");
		processModuleReferenceTable(mrt, st, imp, prog, space, log, monitor);

		if (monitor.isCancelled()) {
			return;
		}
		monitor.setMessage("Processing entry table...");
		processEntryTable(st, ib, et, symbolTable, space, log);

		if (monitor.isCancelled()) {
			return;
		}
		monitor.setMessage("Processing non-resident name table...");
		processNonResidentNameTable(nrnt, symbolTable);

		if (monitor.isCancelled()) {
			return;
		}
		monitor.setMessage("Processing resident name table...");
		processResidentNameTable(rnt, symbolTable);

		if (monitor.isCancelled()) {
			return;
		}
		monitor.setMessage("Processing segment relocations...");
		processRelocations(st, imp, mrt, relocTable, prog, memory, space, log, monitor);

		if (monitor.isCancelled()) {
			return;
		}
		monitor.setMessage("Processing information block...");
		processInformationBlock(ib, nrnt, memory, listing);

		processProperties(ib, prog, monitor);

	}
A {@link Loader} for processing Microsoft New Executable (NE) files.
Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/NeLoader.java