private void ParseTree(XISODirectory parent, long baseOffset, long entryOffset) { var entry = ReadEntry(baseOffset, entryOffset); if ((entry.attribs & 0x10) == 0x10) { var dir = ParseDirectory(parent, entry.name, _partitionOffset + entry.sector * SectorLength, 0); parent.AddDir(dir); _allDirectories.Add(dir); } else { var file = new XISOFile(entry.name, parent, stream, _partitionOffset + entry.sector * SectorLength, entry.length, baseOffset + entryOffset); _allFiles.Add(file); parent.AddFile(file); } if (entry.left != 0) { ParseTree(parent, baseOffset, entry.left * 4); } if (entry.right != 0) { ParseTree(parent, baseOffset, entry.right * 4); } }
private void ParseISO() { _partitionOffset = -1; foreach (long offset in Offsets) { stream.Position = offset + 32 * SectorLength; if (stream.ReadASCIINullTerminated(20) == "MICROSOFT*XBOX*MEDIA") { _partitionOffset = offset; break; } } if (_partitionOffset == -1) { throw new InvalidDataException("File is not Xbox Media (couldn't find magic)"); } _rootSector = stream.ReadUInt32LE(); _rootSize = stream.ReadUInt32LE(); _rootOffset = _partitionOffset + (_rootSector * SectorLength); _allFiles = new List <XISOFile>(); _allDirectories = new List <XISODirectory>(); root = ParseDirectory(null, ROOT_DIR, _rootOffset, 0); }
private XISODirectory ParseDirectory(XISODirectory parent, string name, long baseOffset, long entryOffset) { XISODirectory ret = new XISODirectory(parent, name, baseOffset + entryOffset); ParseTree(ret, baseOffset, entryOffset); return(ret); }