@Override
	public void markup(Program program, boolean isBinary, TaskMonitor monitor, MessageLog log,
			NTHeader nt)
			throws DuplicateNameException, CodeUnitInsertionException, IOException {

		monitor.setMessage("[" + program.getName() + "]: exports...");

		Address addr = PeUtils.getMarkupAddress(program, isBinary, nt, virtualAddress);
		if (!program.getMemory().contains(addr)) {
			return;
		}
		createDirectoryBookmark(program, addr);

		AddressSpace space = program.getAddressFactory().getDefaultAddressSpace();
		ReferenceManager referenceManager = program.getReferenceManager();

		//apply the export directory data structure
		PeUtils.createData(program, addr, toDataType(), log);

		//apply string datatype on export name
		int ptrToName = getName();
		if (ptrToName > 0) {
			Address strAddr = space.getAddress(va(ptrToName, isBinary));
			createTerminatedString(program, strAddr, false, log);
			setPlateComment(program, strAddr, "Export Library Name");
		}

		long funcAddr = va(getAddressOfFunctions(), isBinary);
		long nameAddr = va(getAddressOfNames(), isBinary);
		long ordinalAddr = va(getAddressOfNameOrdinals(), isBinary);

		for (int i = 0; i < getNumberOfFunctions(); ++i) {
			if (monitor.isCancelled()) {
				break;
			}
			Address address = space.getAddress(funcAddr);
			if (i == 0) {
				setPlateComment(program, address, "Export Function Pointers");
			}
			PeUtils.createData(program, address, IBO32, log);
			Data data = program.getListing().getDataAt(address);
			if (data == null || !(data.getValue() instanceof Address)) {
				Msg.warn(this, "Invalid or missing function at " + address);
				break;
			}
			Address refAddr = (Address) data.getValue();
			data.addOperandReference(0, refAddr, RefType.DATA, SourceType.IMPORTED);
			Reference[] refs = data.getOperandReferences(0);
			for (Reference ref : refs) {
				referenceManager.setPrimary(ref, false);
			}
			funcAddr += 4;
		}
		for (int i = 0; i < getNumberOfNames(); ++i) {
			if (monitor.isCancelled()) {
				break;
			}
			Address address = space.getAddress(ordinalAddr);
			if (i == 0) {
				setPlateComment(program, address, "Export Ordinal Values");
			}
			PeUtils.createData(program, address, WORD, log);
			ordinalAddr += 2;
		}
		for (int i = 0; i < getNumberOfNames(); ++i) {
			if (monitor.isCancelled()) {
				break;
			}
			Address address = space.getAddress(nameAddr);
			if (i == 0) {
				setPlateComment(program, address, "Export Name Pointers");
			}
			PeUtils.createData(program, address, IBO32, log);
			Data data = program.getListing().getDataAt(address);
			if (data == null || !(data.getDataType() instanceof IBO32DataType)) {
				Msg.warn(this, "Invalid or missing data at " + address);
				break;
			}
			Address strAddr = (Address) data.getValue();
			data.addOperandReference(0, strAddr, RefType.DATA, SourceType.IMPORTED);
			Reference[] refs = data.getOperandReferences(0);
			for (Reference ref : refs) {
				referenceManager.setPrimary(ref, false);
			}
			createTerminatedString(program, strAddr, true, log);
			nameAddr += 4;
		}
	}
Returns an array of the exports defined in this export data directory.
@return an array of the exports defined in this export data directory
Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/ExportDataDirectory.java