private static void markupCfgFunction(String label, String description,
			Supplier<Long> functionPointerGetter, Program program, NTHeader ntHeader,
			MessageLog log) {
		
		if (functionPointerGetter.get() == 0) {
			return;
		}

		AddressSpace space = program.getAddressFactory().getDefaultAddressSpace();
		Memory mem = program.getMemory();
		SymbolTable symbolTable = program.getSymbolTable();
		boolean is64bit = ntHeader.getOptionalHeader().is64bit();
		
		Address functionPointerAddr = space.getAddress(functionPointerGetter.get());
		PeUtils.createData(program, functionPointerAddr, PointerDataType.dataType, log);

		Address functionAddr;
		try {
			functionAddr = space.getAddress(
				is64bit ? mem.getLong(functionPointerAddr) : mem.getInt(functionPointerAddr));
		}
		catch (MemoryAccessException e) {
			log.appendMsg("Failed to read %s function pointer address at %s".formatted(description,
				functionPointerAddr));
			return;
		}

		try {
			symbolTable.createLabel(functionAddr, label, SourceType.IMPORTED);
		}
		catch (AddressOutOfBoundsException | InvalidInputException e) {
			log.appendMsg("Unable to apply label '%s' to %s function at %s: %s".formatted(label,
				description, functionAddr, e.getMessage()));
		}
		
		if (program.getListing().getDefinedDataAt(functionAddr) == null) {
			AbstractProgramLoader.markAsFunction(program, null, functionAddr);
		}
		else {
			log.appendMsg("Unable to mark %s as function at %s. Data is already defined there."
					.formatted(description, functionAddr));
		}
	}
Performs markup on a ControlFlowGuard function, if it exists.

@param label The ControFlowGuard label to create.
@param description A short description of the ControlFlowGuard function type.
@param functionPointerGetter A method that returns the ControlFlowGuard function's pointer
  address.
@param program The program.
@param ntHeader The PE NTHeader.
@param log The log.
Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/ControlFlowGuard.java