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

		Memory memory = program.getMemory();
		AddressSetView loadedAndInitializedSet = memory.getLoadedAndInitializedAddressSet();
		Listing listing = program.getListing();

		if (!memory.contains(startAddress)) {
			return false;
		}

		int pointerSize = is64Bit(program) ? 8 : 4;
		Address endAddress = startAddress.add(pointerSize * 2); // 2 pointers plus at least one additional byte.
		try {
			MSDataTypeUtils.getBytes(memory, startAddress, pointerSize * 2);
		}
		catch (InvalidDataTypeException e) {
			return false; // Couldn't get enough bytes from memory.
		}

		// Address should start on a byte boundary based on pointer size.
		if (startAddress.getOffset() % pointerSize != 0) {
			return false;
		}
		// First component should be reference.
		Address vfTableAddress = getAbsoluteAddress(program, startAddress);
		if (vfTableAddress == null || !memory.contains(vfTableAddress)) {
			return false;
		}

		// Check Spare Data. Should be 0 or a valid address in program.
		try {
			Address spareDataAddress = getSpareDataAddress(memory, startAddress);
			if (spareDataAddress != null && spareDataAddress.getOffset() != 0L &&
				!loadedAndInitializedSet.contains(spareDataAddress)) {
				return false;
			}
		}
		catch (AddressOutOfBoundsException e1) {
			return false;
		}

		String vfTableName = getVFTableName(new MemoryBufferImpl(memory, startAddress));
		if (vfTableName == null) {
			return false;
		}
		int nameLength = vfTableName.length();
		if (nameLength == 0) {
			return false;
		}
		int lengthWithoutAlignPadding = getNameOffset(program) + nameLength;
		int mod = lengthWithoutAlignPadding % pointerSize;
		int padSize = (mod == 0) ? 0 : (pointerSize - mod);
		int paddedLength = lengthWithoutAlignPadding + padSize;
		try {
			MSDataTypeUtils.getBytes(memory, startAddress, paddedLength);
		}
		catch (InvalidDataTypeException e) {
			return false; // Couldn't get enough bytes from memory for an entire padded Rtti0.
		}
		if (containsWhitespace(vfTableName)) {
			return false;
		}

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

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

		return true;
	}
Gets the total length of the data created when this data type is placed at the indicated
address in memory.
@param memory the program memory for this data.
@param address the start address of the data.
@param bytes the bytes for this data.
@return the length of the data. zero is returned if valid data can't be created at the
indicated address using this data type.
Ghidra/Features/Base/src/main/java/ghidra/app/util/datatype/microsoft/RTTI0DataType.java