@Override
	protected void validateModelSpecificInfo() throws InvalidDataTypeException {

		Program program = getProgram();
		Memory memory = program.getMemory();
		Address startAddress = getAddress();

		DataType rtti1Dt = getDataType();
		DataType baseDt = DataTypeUtils.getBaseDataType(rtti1Dt);
		Structure rtti1Struct = (Structure) baseDt;
		int length = rtti1Dt.getLength();

		// Test that we can get the expected number of bytes.
		MSDataTypeUtils.getBytes(memory, startAddress, length);

		boolean validateReferredToData = validationOptions.shouldValidateReferredToData();

		// First component is either a direct reference or an image base offset.
		Address rtti0Address = getReferencedAddress(program, startAddress);
		if (rtti0Address == null) {
			invalid("Invalid TypeDescriptor reference (pTypeDescriptor)."); // throws Exception
		}
		rtti0Model = new TypeDescriptorModel(program, rtti0Address, validationOptions);
		if (validateReferredToData) {
			try {
				rtti0Model.validate();
			}
			catch (Exception e) {
				invalid(e); // throws Exception
			}
		}
		else if (!rtti0Model.isLoadedAndInitializedAddress()) {
			invalid("Data referencing " + rtti0Model.getName() +
				" data type isn't a loaded and initialized address " + rtti0Address + ".");
		}

		// Middle bytes are 5 dword numeric values.
		try {
			// numBases should be >= 0
			int numBases = memory.getInt(startAddress.add(NUM_BASES_OFFSET));
			// Check for valid numBases?
			if (numBases < 0) {
				invalid(); // throws Exception
			}

			DataTypeComponent pmdComponent = rtti1Struct.getComponent(MEMBER_DISP_ORDINAL);
			DataType pmdDt = pmdComponent.getDataType();
			DataType baseDataType = DataTypeUtils.getBaseDataType(pmdDt);
			Structure pmdDataType = (Structure) baseDataType;
			int pmdOffset = pmdComponent.getOffset();
			int mdispOffset = pmdDataType.getComponent(MDISP_ORDINAL).getOffset(); // mdisp
			int pdispOffset = pmdDataType.getComponent(PDISP_ORDINAL).getOffset(); // pdisp
			int vdispOffset = pmdDataType.getComponent(VDISP_ORDINAL).getOffset(); // vdisp

			// member displacement should be >= 0
			int mDisp = memory.getInt(startAddress.add(pmdOffset + mdispOffset));
			if (mDisp < 0) {
				invalid(); // throws Exception
			}

			// vbtable displacement should be >= -1
			int pDisp = memory.getInt(startAddress.add(pmdOffset + pdispOffset));
			if (pDisp < -1) {
				invalid(); // throws Exception
			}

			// displacement within vbtable should be >= 0
			int vDisp = memory.getInt(startAddress.add(pmdOffset + vdispOffset));
			if (vDisp < 0) {
				invalid(); // throws Exception
			}

			// attributes can be any bit mask number, so don't check it
//			int attributes = memory.getInt(startAddress.add(ATTRIBUTES_OFFSET));
		}
		catch (MemoryAccessException | AddressOutOfBoundsException e) {
			invalid(); // throws Exception
		}

		// Last component is either a direct reference or an image base offset.
		Address rtti3Address =
			getReferencedAddress(program, startAddress.add(CLASS_HIERARCHY_POINTER_OFFSET));
		if (rtti3Address == null) {
			invalid(); // throws Exception
		}
		// Make sure we don't follow flow or will get stuck in infinite loop.
		DataValidationOptions dontFollowOptions = new DataValidationOptions(validationOptions);
		dontFollowOptions.setValidateReferredToData(false);
		rtti3Model = new Rtti3Model(program, rtti3Address, dontFollowOptions);
		if (validateReferredToData) {
			try {
				rtti3Model.validate();
			}
			catch (Exception e) {
				invalid(e); // throws Exception
			}
		}
		else if (!rtti3Model.isLoadedAndInitializedAddress()) {
			invalid("Data referencing " + rtti3Model.getName() +
				" data type isn't a loaded and initialized address " + rtti3Address + ".");
		}
	}
Whether or not the memory at the indicated address appears to be a valid location for the
indicated number of HandlerType data types.
@throws InvalidDataTypeException if this model's location does not appear to be a valid 
group of catch handler entries. The exception has a message indicating
why it does not appear to be a valid location for the data type.
Ghidra/Features/MicrosoftCodeAnalyzer/src/main/java/ghidra/app/cmd/data/rtti/Rtti1Model.java