public static DataType getDataType(Program program) {

		DataTypeManager dataTypeManager = program.getDataTypeManager();
		CategoryPath categoryPath = new CategoryPath(CATEGORY_PATH);
		StructureDataType struct = isRelative(program)
				? MSDataTypeUtils.getAlignedPack8Structure(dataTypeManager, categoryPath,
					STRUCTURE_NAME)
				: MSDataTypeUtils.getAlignedPack4Structure(dataTypeManager, categoryPath,
					STRUCTURE_NAME);

		PointerDataType pointerDataType =
			new PointerDataType(new VoidDataType(dataTypeManager), dataTypeManager);

		boolean hasVFPointer = hasVFPointer(program);

		// Add the components.
		DataType compDt;

		// First component is vfTable pointer or hash value
		if (hasVFPointer) {
			struct.add(pointerDataType, "pVFTable", null);
		}
		else {
			compDt = new DWordDataType(dataTypeManager);
			struct.add(compDt, "hash", null);
		}

		struct.add(pointerDataType, "spare", null);

		// The final structure component is a flexible-array corresponding to a variable length
		// char array (i.e., null terminated string).  The storage for this array is not
		// included in the length of the structure and must have a properly sized char array
		// created immediately following the structure in memory.

		struct.add(new ArrayDataType(CharDataType.dataType, 0, -1), "name", null);

		return MSDataTypeUtils.getMatchingDataType(program, struct);
	}
Gets the TypeDescriptor structure for the indicated program
@param program the program which will contain this model's data type
@return the TypeDescriptor structure
Ghidra/Features/MicrosoftCodeAnalyzer/src/main/java/ghidra/app/cmd/data/TypeDescriptorModel.java