@Override
	public boolean isValid(Program program, Address startAddress,
			DataValidationOptions validationOptions) {

		Memory memory = program.getMemory();
		if (!memory.contains(startAddress)) {
			return false;
		}

		// RTTI4 should start on a 4 byte boundary.
		if (startAddress.getOffset() % 4 != 0) {
			return false;
		}

		Listing listing = program.getListing();
		Address endAddress = startAddress.add(LENGTH - 1);
		try {
			MSDataTypeUtils.getBytes(memory, startAddress, LENGTH);
		}
		catch (InvalidDataTypeException e) {
			return false; // Couldn't get enough bytes from memory for an RTTI3.
		}

		if (!validationOptions.shouldIgnoreInstructions() &&
			containsInstruction(listing, startAddress, endAddress)) {
			return false;
		}

		if (!validationOptions.shouldIgnoreDefinedData() &&
			containsDefinedData(listing, startAddress, endAddress)) {
			return false;
		}

		// First 8 bytes is 2 dword numeric values.

		// Next four bytes after 2 dwords should be number of RTTI1 pointers in RTTI2.
		long rtti1Count = getRtti1Count(memory, startAddress);
		if (rtti1Count < 0 || rtti1Count > MAX_RTTI_1_COUNT) { // For now assume we shouldn't be seeing more than 1000 pointers in RTTI2.
			return false;
		}

		boolean validateReferredToData = validationOptions.shouldValidateReferredToData();

		// Last component should refer to RTTI2.
		Address rtti2Address = getRtti2Address(memory, startAddress);
		RTTI2DataType rtti2 = new RTTI2DataType(rtti1Count, program.getDataTypeManager());
		if (rtti2Address == null ||
			(validateReferredToData && !rtti2.isValid(program, rtti2Address, validationOptions))) {
			return false;
		}

		return true;
	}
Gets the address of the RTTI2 that is referred to from an RTTI3 structure that is placed at 
the indicated address.
@param memory the memory with the data for the RTTI structures.
@param rtti3Address address of an RTTI3 structure
@return the address of the RTTI2 structure or null.
Ghidra/Features/Base/src/main/java/ghidra/app/util/datatype/microsoft/RTTI3DataType.java