예제 #1
0
        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);
            }
        }
예제 #2
0
        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);
        }
예제 #3
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);
        }