@Override
	protected DataTypeComponent[] getAllComponents(MemBuffer buf) {
		Program program = buf.getMemory().getProgram();
		Pointer pointer = new PointerDataType(program.getDataTypeManager());
		DataTypeComponent[] comps = new DataTypeComponent[3];
		comps[0] = new ReadOnlyDataTypeComponent(pointer, this, pointer.getLength(), 0,
			VF_TABLE_POINTER_OFFSET, "pVFTable", "vfTablePointer");
		int dataPointerOffset = getSpareDataOffset(program);
		comps[1] = new ReadOnlyDataTypeComponent(pointer, this, pointer.getLength(), 1,
			dataPointerOffset, "spare", "pointer to spare data");
		Address start = buf.getAddress();
		int nameOffset = getNameOffset(program);
		Address nameAddress = start.add(nameOffset);
		MemoryBufferImpl nameBuf = new MemoryBufferImpl(buf.getMemory(), nameAddress, 1024);
		DataTypeInstance dti =
			DataTypeInstance.getDataTypeInstance(new TerminatedStringDataType(), nameBuf, false);

		if (dti != null) {
			comps[2] = new ReadOnlyDataTypeComponent(dti.getDataType(), this, dti.getLength(), 2,
				nameOffset, "name", null);
		}
		else {
			comps[2] = new ReadOnlyDataTypeComponent(DataType.DEFAULT, this, 1, 2, nameOffset,
				"name", null);
		}
		int length = nameOffset + dti.getLength();
		int pointerSize = is64Bit(program) ? 8 : 4;
		int mod = length % pointerSize;
		if (mod == 0) {
			return comps;
		}

		int offset = length;
		int bytesNeeded = (mod != 0) ? (pointerSize - mod) : 0;
		DataType dt = new ArrayDataType(new ByteDataType(), bytesNeeded, 1);
		DataTypeComponent[] alignedComps = new DataTypeComponent[4];
		System.arraycopy(comps, 0, alignedComps, 0, 3);
		alignedComps[3] =
			new ReadOnlyDataTypeComponent(dt, this, bytesNeeded, 3, offset, "alignmentBytes", null);
		return alignedComps;
	}
Creates a dynamic Type Descriptor data type.
@param dtm the data type manager for this data type.
Ghidra/Features/Base/src/main/java/ghidra/app/util/datatype/microsoft/RTTI0DataType.java