private void processKModInfoStructures(List<Long> machoHeaderOffsets, TaskMonitor monitor)
			throws IOException {

		Map<MachoPrelinkMap, Long> infoToMachoMap = new HashMap<>();

		kernelCacheDirectory = GFileImpl.fromFilename(this, root, "kernelcache", true, -1, null);

		//
		// if we failed to parse the PRELINK XML file,
		// then look for the kmod_info structure in each KEXT file
		//
		for (long machoHeaderOffset : machoHeaderOffsets) {
			if (monitor.isCancelled()) {
				break;
			}
			String kextName = "Kext_0x" + Conv.toHexString(machoHeaderOffset) + ".kext";
			try {
				MachHeader header = new MachHeader(provider, machoHeaderOffset);
				header.parse();
				String name = findNameOfKext(header, monitor);
				if (name != null) {
					kextName = name + ".kext";
				}
			}
			catch (Exception e) {
				// Failed to parse...shouldn't happen
				Msg.debug(this, "Exception while parsing: " + kextName, e);
			}
			if (machoHeaderOffset == 0x0) {
				kextName = SYSTEM_KEXT; // TODO: this won't happen anymore since the System kext isn't in list of offsets. Problem?
			}
			if (!infoToMachoMap.containsValue(machoHeaderOffset)) {//if there is not already a KEXT at this address, then store it
				long length = provider.length() - machoHeaderOffset;
				GFileImpl file = GFileImpl.fromFilename(this, kernelCacheDirectory, kextName, false,
					length, null);
				unnamedMachoFileMap.put(machoHeaderOffset, file);
				fileToMachoOffsetMap.put(file, machoHeaderOffset);
			}
		}
	}
Processes PRELINK and Macho-O offsets in order to map files to their Mach-O offsets in the 
providers.

@param prelinkList The list of discovered {@link MachoPrelinkMap}s.
@param machoHeaderOffsets The list of provider offsets where prelinked Mach-O headers start.
@param monitor A monitor
@throws IOException if an IO-related problem occurred.
@throws MachException if there was a problem parsing Mach-O headers.
Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats/ios/prelink/MachoPrelinkFileSystem.java