private void addByteSearchPattern(MemoryBytePatternSearcher searcher,
			HashMap<Address, VfTableModel> foundVFtables, Address rtti4Address, byte[] bytes) {

		if (bytes == null) {
			return;
		}

		GenericMatchAction<Address> action = new GenericMatchAction<Address>(rtti4Address) {
			@Override
			public void apply(Program prog, Address addr, Match match) {

				Address possibleVfTableAddr = addr.add(prog.getDefaultPointerSize());

				// See if VfTable is valid, and add to rtti4 to vfTable map
				try {
					VfTableModel vfTableModel =
						new VfTableModel(prog, possibleVfTableAddr, validationOptions);
					vfTableModel.validate();

					VfTableModel existing = foundVFtables.put(rtti4Address, vfTableModel);

					if (existing != null) {
						// potential table already found, is an error, don't know which is right
						String message = "More than one possible vfTable found for " +
							Rtti4Model.DATA_TYPE_NAME + " @ " + rtti4Address;
						handleErrorMessage(prog, rtti4Address, message);
					}
				}
				catch (InvalidDataTypeException e) {
					// This isn't a valid model.
				}
			}
		};

		GenericByteSequencePattern<Address> genericByteMatchPattern =
			new GenericByteSequencePattern<Address>(bytes, action);

		searcher.addPattern(genericByteMatchPattern);
	}
Add a search pattern, to the searcher, for the set of bytes representing an rtti4 location.
Only one VFTable for is allowed for an RTT4 location, last one in wins and gets created.

@param searcher byte pattern searcher
@param foundVFtables list of addresses accumulated when actual search is performed
@param rtti4Address location of rttiAddress to find vfTable for
@param bytes bytes representing rtti4Addres to be found in memory
Ghidra/Features/MicrosoftCodeAnalyzer/src/main/java/ghidra/app/cmd/data/rtti/CreateRtti4BackgroundCmd.java