private DataType createVtShape(VtShapeMsType msShape) throws CancelledException {
		List<VtShapeDescriptorMsProperty> list = msShape.getDescriptorList();
		StructureDataType shape = new StructureDataType(applicator.getAnonymousTypesCategory(),
			"vtshape" + msShape.getRecordNumber().getNumber(), 0, applicator.getDataTypeManager());
		List<DefaultPdbUniversalMember> members = new ArrayList<>();
		int offset = 0;
		int defaultSize = applicator.getDataTypeManager().getDataOrganization().getPointerSize();
		// Since each element has its own property, we have to assume there can be mixed
		//  properties in the table, thus each element must be set separately.
		// However, note that the data types referenced by the symbols (e.g., GDATAx) at the
		// vftable locations in memory seem to have these as an array of constant pointers to
		//  functions with no argument and void return; to me, this does not quite agree with what
		//  we have here where each element having its own pointer property.  For now,
		//  using a structure here.  Moreover, we might want to eventually fix-up the arrays put
		//  down with the GDATAx symbols with structures that contain pointers to func specs that
		//  match the real function signatures at each element.
		for (VtShapeDescriptorMsProperty descriptor : list) {
			DataType elementType;
			switch (descriptor) {
				case NEAR:
					// near16:
					//   16-bit offset
					elementType = Undefined2DataType.dataType;
					break;
				case FAR:
					// far16:
					//   16-bit segment
					//   16-bit offset
					elementType = Undefined4DataType.dataType;
					break;
				case NEAR32:
					// near32:
					//   32-bit offset
					elementType = Undefined4DataType.dataType;
					break;
				case FAR32:
					// far32:
					//   16-bit segment
					//   32-bit offset
					elementType = Undefined6DataType.dataType;
					break;
				// lump remaining together; we do not know about thin, outer, or meta
				case UNUSED:
					// Special message for unused, followed by fall through case
					applicator.appendLogMsg("PDB Warning: UNUSED propery found in VTShape.");
				case THIN:
				case OUTER:
				case META:
				default:
					// If any element type is not know, we will not return a full shape structure
					// Instead, we return void type.
					applicator.appendLogMsg("PDB Warning: No type conversion for " +
						msShape.toString() + " as underlying type for pointer. Using void.");
					return VoidDataType.dataType;
			}
			int size = elementType.getLength();
			if (size == defaultSize) {
				elementType = PointerDataType.dataType;
			}
			DefaultPdbUniversalMember member =
				new DefaultPdbUniversalMember("", elementType, offset);
			offset += size;
			members.add(member);
		}
		// offset has the total size at this point
		if (!DefaultCompositeMember.applyDataTypeMembers(shape, false, false, offset, members,
			msg -> Msg.warn(this, msg), applicator.getCancelOnlyWrappingMonitor())) {
			CompositeTypeApplier.clearComponents(shape);
		}
		return shape; // not resolved
	}
Returns the name
@param type the MS VtShape
@return the name
Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/VtShapeTypeApplier.java