private void processVersionInfo(Address addr, ResourceInfo info, Program program,
			MessageLog log, TaskMonitor monitor) throws IOException {
		VS_VERSION_INFO versionInfo = null;
		try {
			int ptr = ntHeader.rvaToPointer(info.getAddress());
			if (ptr < 0) {
				Msg.error(this, "Invalid RVA " + Integer.toHexString(info.getAddress()));
				return;
			}
			versionInfo = new VS_VERSION_INFO(reader, ptr);
			PeUtils.createData(program, addr, versionInfo.toDataType(), log);
		}
		catch (DuplicateNameException e) {
			Msg.error(this, "Unexpected Exception: VS_VERSION_INFO structure previously defined",
				e);
		}
		VS_VERSION_CHILD[] children = versionInfo.getChildren();
		for (VS_VERSION_CHILD child : children) {
			if (monitor.isCancelled()) {
				return;
			}
			markupChild(child, addr, program, log, monitor);
		}

		Options programInfoOptions = program.getOptions(Program.PROGRAM_INFO);
		String[] keys = versionInfo.getKeys();
		for (String key : keys) {
			if (monitor.isCancelled()) {
				return;
			}
			String value = versionInfo.getValue(key);
			programInfoOptions.setString(getPeResourceProperty(key), value);
		}
	}
Gets a program property name to represent PE resource property with the given key name

@param key The key name
@return A program property name to represent PE resource property with the given key name
Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/ResourceDataDirectory.java