private DataType doGetDataType() {
		if (!hasValidMagicNum()) {
			return null;
		}
		Program program = getProgram();
		if (dataType == null) {
			boolean isRelative = isRelative();
			DataTypeManager dataTypeManager = program.getDataTypeManager();
			CategoryPath categoryPath = new CategoryPath(CATEGORY_PATH);
			StructureDataType struct =
				getAlignedPack4Structure(dataTypeManager, categoryPath, getStructureName());

			// Add the components.
			DataType compDt;

			/* comps[0] */
			// Magic number is low order 29 bits; bbtFlags is 3 high order bits.
			compDt = new UnsignedIntegerDataType(dataTypeManager);
			struct.add(compDt, "magicNumber_and_bbtFlags", null);

			/* comps[1] */
			compDt = new TypedefDataType(new CategoryPath("/ehdata.h"), "__ehstate_t",
				new IntegerDataType(dataTypeManager), dataTypeManager);
			struct.add(compDt, "maxState", null);

			/* comps[2] */
			if (isRelative) {
				compDt = new IBO32DataType(dataTypeManager);
				struct.add(compDt, "dispUnwindMap", null);
			}
			else {
				compDt = new PointerDataType(EHUnwindModel.getDataType(program), dataTypeManager);
				struct.add(compDt, "pUnwindMap", null);
			}

			/* comps[3] */
			compDt = new UnsignedIntegerDataType(dataTypeManager);
			struct.add(compDt, "nTryBlocks", null);

			/* comps[4] */
			if (isRelative) {
				compDt = new IBO32DataType(dataTypeManager);
				struct.add(compDt, "dispTryBlockMap", null);
			}
			else {
				compDt = new PointerDataType(EHTryBlockModel.getDataType(program), dataTypeManager);
				struct.add(compDt, "pTryBlockMap", null);
			}

			/* comps[5] */
			compDt = new UnsignedIntegerDataType(dataTypeManager);
			struct.add(compDt, "nIPMapEntries", null);

			/* comps[6] */
			if (isRelative) {
				compDt = new IBO32DataType(dataTypeManager);
				struct.add(compDt, "dispIPToStateMap", null);
			}
			else {
				compDt = new PointerDataType(new VoidDataType(dataTypeManager), dataTypeManager);
				struct.add(compDt, "pIPToStateMap", null);
			}

			if (isRelative) { /* comps[7] */
				compDt = new IntegerDataType(dataTypeManager);
				struct.add(compDt, "dispUnwindHelp", null);
			}

			if (isV2 || isV3) {
				if (isRelative) { /* comps[8] */
					compDt = new IBO32DataType(dataTypeManager);
					struct.add(compDt, "dispESTypeList", null);
				}
				else { /* comps[7] */
					compDt = new PointerDataType(EHESTypeListModel.getDataType(program),
						dataTypeManager);
					struct.add(compDt, "pESTypeList", null);
				}
			}

			if (isV3) { /* comps[8 or 9] */
				compDt = new IntegerDataType(dataTypeManager);
				struct.add(compDt, "EHFlags", null);
			}

			TypedefDataType typedef =
				new TypedefDataType(categoryPath, getName(), struct, dataTypeManager);

			dataType = typedef;
		}

		return MSDataTypeUtils.getMatchingDataType(program, dataType);
	}
If this is a valid FuncInfo location, the correct FuncInfo structure is returned.
Otherwise this returns a null.
@return the FuncInfo structure or null.
Ghidra/Features/MicrosoftCodeAnalyzer/src/main/java/ghidra/app/cmd/data/exceptionhandling/EHFunctionInfoModel.java