Esempio n. 1
0
        public XeXHeader(MemoryStream file)
        {
            MyBinaryReader reader;

            try
            {
                reader = new MyBinaryReader(file, EndianType.BigEndian);

                reader.BaseStream.Seek(0L, SeekOrigin.Begin);
                if (Encoding.ASCII.GetString(reader.ReadBytes(4)) == "XEX2")
                {
                    reader.BaseStream.Seek(20L, SeekOrigin.Begin);

                    uint   headerCount = reader.ReadUInt32();
                    byte[] infoArray   = new byte[] { 0, 4, 0, 6 };

                    for (int i = 0; i < headerCount; i++)
                    {
                        byte[] headerIdArray = reader.ReadBytes(4);

                        uint headerId = BitConverter.ToUInt32(headerIdArray, 0);

                        if (headerId == BitConverter.ToUInt32(infoArray, 0))
                        {
                            uint dataAddress = reader.ReadUInt32();

                            reader.BaseStream.Seek((long)dataAddress, SeekOrigin.Begin);
                            this.mediaId        = reader.ReadBytes(4);
                            this.version        = reader.ReadUInt32();
                            this.baseVersion    = reader.ReadUInt32();
                            this.titleId        = reader.ReadBytes(4);
                            this.platform       = reader.ReadByte();
                            this.executableType = reader.ReadByte();
                            this.discNumber     = reader.ReadByte();
                            this.discCount      = reader.ReadByte();
                            break;
                        }
                        else
                        {
                            reader.ReadUInt32();
                        }
                    }
                }
                else
                {
                    throw new Exception("Extracted file is not XEX file");
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

            reader.Close();
        }
Esempio n. 2
0
        /// <summary>
        /// Search for default.xex
        /// </summary>
        /// <returns>true if found; false if not found</returns>
        private bool SearchForDefaultXeX()
        {
            try
            {
                this.iso.Reader.BaseStream.Seek((long)(((long)this.iso.IsoInfo.RootDirSector * (long)this.iso.IsoInfo.SectorSize) + (long)this.iso.IsoInfo.RootOffset), System.IO.SeekOrigin.Begin);

                byte[] rootDirBuffer = this.iso.Reader.ReadBytes((int)this.iso.IsoInfo.RootDirSize);

                MemoryStream   ms     = new MemoryStream(rootDirBuffer);
                MyBinaryReader reader = new MyBinaryReader(ms);

                while (reader.BaseStream.Position < this.iso.IsoInfo.RootDirSize)
                {
                    ushort offsetLeftSubTreeTmp  = reader.ReadUInt16();
                    ushort offsetRightSubTreeTmp = reader.ReadUInt16();

                    if (offsetLeftSubTreeTmp != 0xffff && offsetRightSubTreeTmp != 0xffff)
                    {
                        uint   startingSectorOfFileTmp = reader.ReadUInt32();
                        uint   fileSizeTmp             = reader.ReadUInt32();
                        uint   fileAttribute           = (uint)reader.ReadByte();
                        byte   fileNameLengthTmp       = reader.ReadByte();
                        string fileNameTmp             = Encoding.ASCII.GetString(rootDirBuffer, (int)reader.BaseStream.Position, fileNameLengthTmp);
                        reader.BaseStream.Seek((long)fileNameLengthTmp, SeekOrigin.Current);
                        long num1 = reader.BaseStream.Position % 4L;
                        if ((reader.BaseStream.Position % 4L) != 0L)
                        {
                            reader.BaseStream.Seek(4L - (reader.BaseStream.Position % 4L), SeekOrigin.Current);
                        }

                        if (fileNameTmp.ToLower() == this.fileName.ToLower())
                        {
                            this.offsetLeftSubTree    = offsetLeftSubTreeTmp;
                            this.offsetRightSubTree   = offsetRightSubTreeTmp;
                            this.startingSectorOfFile = startingSectorOfFileTmp;
                            this.fileSize             = fileSizeTmp;
                            this.fileNameLength       = fileNameLengthTmp;
                            //this.iso.Reader.Read(this.file, (int)(this.iso.IsoInfo.RootOffset + (this.startingSectorOfFile * this.iso.IsoInfo.SectorSize)), (int)this.fileSize);
                            this.iso.Reader.BaseStream.Seek((long)((long)this.iso.IsoInfo.RootOffset + ((long)this.startingSectorOfFile * (long)this.iso.IsoInfo.SectorSize)), SeekOrigin.Begin);
                            this.file = this.iso.Reader.ReadBytes((int)this.fileSize);
                            return(true);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Error browsing ISO for default.xex", ex);
            }

            return(false);
        }
Esempio n. 3
0
 private long SearchForDefaultXeX()
 {
     try
     {
         this.iso.Reader.BaseStream.Seek((long)((long)((long)this.iso.IsoInfo.RootDirSector * (long)this.iso.IsoInfo.SectorSize) + (long)this.iso.IsoInfo.RootOffset), SeekOrigin.Begin);
         byte[]         buffer = this.iso.Reader.ReadBytes((int)this.iso.IsoInfo.RootDirSize);
         MemoryStream   s      = new MemoryStream(buffer);
         MyBinaryReader reader = new MyBinaryReader(s);
         while (reader.BaseStream.Position < this.iso.IsoInfo.RootDirSize)
         {
             ushort num  = reader.ReadUInt16();
             ushort num2 = reader.ReadUInt16();
             if ((num != 0xffff) && (num2 != 0xffff))
             {
                 uint   num3  = reader.ReadUInt32();
                 uint   num4  = reader.ReadUInt32();
                 uint   num5  = reader.ReadByte();
                 byte   count = reader.ReadByte();
                 string str   = Encoding.ASCII.GetString(buffer, (int)reader.BaseStream.Position, count);
                 reader.BaseStream.Seek((long)count, SeekOrigin.Current);
                 long num7 = reader.BaseStream.Position % 4L;
                 if ((reader.BaseStream.Position % 4L) != 0L)
                 {
                     reader.BaseStream.Seek(4L - (reader.BaseStream.Position % 4L), SeekOrigin.Current);
                 }
                 if ((str.ToLower() == this.fileName.ToLower()) || (str.ToLower() == this.fileName2.ToLower()))
                 {
                     this.offsetLeftSubTree    = num;
                     this.offsetRightSubTree   = num2;
                     this.startingSectorOfFile = num3;
                     this.fileSize             = num4;
                     this.fileNameLength       = count;
                     this.iso.Reader.BaseStream.Seek(((long)this.iso.IsoInfo.RootOffset + (long)((long)this.startingSectorOfFile * (long)this.iso.IsoInfo.SectorSize)), SeekOrigin.Begin);
                     return(iso.Reader.BaseStream.Position);
                 }
             }
         }
     }
     catch (Exception exception)
     {
         throw new Exception("Error browsing ISO for default.xex/xeb", exception);
     }
     return(-1);
 }
Esempio n. 4
0
        public VTSM_PGCI_LU_MENU(byte[] array, int numberOfMenu)
        {
            MemoryStream   s      = new MemoryStream(array);
            MyBinaryReader reader = new MyBinaryReader(s);

            reader.Skip(8 + (numberOfMenu * 8));
            this.isGameMenu = reader.ReadByte() == 0;
            reader.Skip(3);
            this.startByteVTSM_PGCI = reader.ReadInt32B();
            reader.BaseStream.Seek((long)(this.startByteVTSM_PGCI + 0xe8), SeekOrigin.Begin);
            short num = reader.ReadInt16B();

            reader.BaseStream.Seek((long)(this.startByteVTSM_PGCI + num), SeekOrigin.Begin);
            reader.Skip(8);
            this.sector = reader.ReadInt32B();
        }
Esempio n. 5
0
        public VTSM_PGCI_LU_MENU(byte[] array, int numberOfMenu)
        {
            MemoryStream   ms = new MemoryStream(array);
            MyBinaryReader br = new MyBinaryReader(ms);

            br.Skip(8 + (numberOfMenu * 8));
            //byte a = br.ReadByte();
            isGameMenu = br.ReadByte() == (byte)0;
            br.Skip(3);
            startByteVTSM_PGCI = br.ReadInt32B();

            br.BaseStream.Seek(startByteVTSM_PGCI + 0xE8, SeekOrigin.Begin);
            short offsetCellPlaybackInformation = br.ReadInt16B();

            br.BaseStream.Seek(startByteVTSM_PGCI + offsetCellPlaybackInformation, SeekOrigin.Begin);
            br.Skip(8);
            sector = br.ReadInt32B();
        }
Esempio n. 6
0
        public XeXHeader(MyBinaryReader reader)
        {
            long position = reader.BaseStream.Position;

            try
            {
                byte[] b = reader.ReadBytes(4);
                if (Encoding.ASCII.GetString(b) == "XEX2")
                {
                    reader.BaseStream.Seek(position + 20L, SeekOrigin.Begin);
                    uint num = reader.ReadUInt32();

                    UInt32 einfo  = BitConverter.ToUInt32(executioninfo, 0);
                    UInt32 tstamp = BitConverter.ToUInt32(basefiletimestamp, 0);

                    for (int i = 0; i < num; i++)
                    {
                        UInt32 val     = BitConverter.ToUInt32(reader.ReadBytes(4), 0);
                        uint   pos     = reader.ReadUInt32();
                        long   savepos = reader.BaseStream.Position;
                        if (val == einfo)
                        {
                            reader.BaseStream.Seek((long)position + pos, SeekOrigin.Begin);
                            this.short_mediaId  = reader.ReadBytes(4);
                            this.version        = reader.ReadUInt32();
                            this.baseVersion    = reader.ReadUInt32();
                            this.titleId        = reader.ReadBytes(4);
                            this.platform       = reader.ReadByte();
                            this.executableType = reader.ReadByte();
                            this.discNumber     = reader.ReadByte();
                            this.discCount      = reader.ReadByte();
                            reader.BaseStream.Seek(savepos, SeekOrigin.Begin);
                        }
                        else if (val == tstamp)
                        {
                            reader.BaseStream.Seek((long)position + pos + 4, SeekOrigin.Begin);
                            this.date =
                                new DateTime(1970, 1, 1, 0, 0, 0).Add(
                                    TimeSpan.FromTicks((long)reader.ReadUInt32() * TimeSpan.TicksPerSecond));
                            reader.BaseStream.Seek(savepos, SeekOrigin.Begin);
                        }
                    }
                    //Read cert
                    reader.BaseStream.Seek((long)position + 0x10, SeekOrigin.Begin);
                    uint offset = reader.ReadUInt32();
                    reader.BaseStream.Seek((long)position + (long)offset + 0x140, SeekOrigin.Begin);
                    mediaid = reader.ReadBytes(16);
                    reader.BaseStream.Seek((long)position + (long)offset + 0x178, SeekOrigin.Begin);
                    regioncode = reader.ReadUInt32();
                }
                else if (Encoding.ASCII.GetString(b) == "XBEH")
                {
                    reader.EndianType = EndianType.LittleEndian;
                    reader.BaseStream.Seek(position + 0x110, SeekOrigin.Begin);
                    uint pos = reader.ReadUInt32();
                    this.date = new DateTime(1970, 1, 1, 0, 0, 0).Add(TimeSpan.FromTicks((long)reader.ReadUInt32() * TimeSpan.TicksPerSecond));
                    reader.BaseStream.Seek(position + pos + 0x8, SeekOrigin.Begin);
                    this.titleId    = new byte[4];
                    this.titleId[3] = reader.ReadByte();
                    this.titleId[2] = reader.ReadByte();
                    this.titleId[1] = reader.ReadByte();
                    this.titleId[0] = reader.ReadByte();
                    byte[] b2 = reader.ReadBytes(0x40);
                    this.title = Encoding.Unicode.GetString(b2).Replace("\0", string.Empty).Trim();
                    reader.BaseStream.Seek(position + pos + 0xA8, SeekOrigin.Begin);
                    this.discNumber = this.discCount = (byte)(reader.ReadUInt32() + 1);
                    this.version    = reader.ReadUInt32();
                }
                else
                {
                    throw new Exception("Not XEX/XEB file");
                }
            }
            catch (Exception exception)
            {
                if (reader != null)
                {
                    reader.BaseStream.Seek(position, SeekOrigin.Begin);
                }
                throw exception;
            }
            reader.BaseStream.Seek(position, SeekOrigin.Begin);
        }
Esempio n. 7
0
        private object?LoadObjectV1(int dataOffset)
        {
            Debug.Assert(System.Threading.Monitor.IsEntered(reader));
            reader.Seek(dataSectionPosition + dataOffset, SeekOrigin.Begin);
            int typeIndex = reader.Read7BitEncodedInt();

            if (typeIndex == -1)
            {
                return(null);
            }
            string typeName = FindType(typeIndex);
            int    comma    = typeName.IndexOf(',');

            if (comma > 0)
            {
                // strip assembly name
                typeName = typeName.Substring(0, comma);
            }
            switch (typeName)
            {
            case "System.String":
                return(reader.ReadString());

            case "System.Byte":
                return(reader.ReadByte());

            case "System.SByte":
                return(reader.ReadSByte());

            case "System.Int16":
                return(reader.ReadInt16());

            case "System.UInt16":
                return(reader.ReadUInt16());

            case "System.Int32":
                return(reader.ReadInt32());

            case "System.UInt32":
                return(reader.ReadUInt32());

            case "System.Int64":
                return(reader.ReadInt64());

            case "System.UInt64":
                return(reader.ReadUInt64());

            case "System.Single":
                return(reader.ReadSingle());

            case "System.Double":
                return(reader.ReadDouble());

            case "System.DateTime":
                // Ideally we should use DateTime's ToBinary & FromBinary,
                // but we can't for compatibility reasons.
                return(new DateTime(reader.ReadInt64()));

            case "System.TimeSpan":
                return(new TimeSpan(reader.ReadInt64()));

            case "System.Decimal":
                int[] bits = new int[4];
                for (int i = 0; i < bits.Length; i++)
                {
                    bits[i] = reader.ReadInt32();
                }
                return(new decimal(bits));

            default:
                return(new ResourceSerializedObject(FindType(typeIndex), this, reader.BaseStream.Position));
            }
        }
Esempio n. 8
0
        public ResourcesFile(Stream stream, bool leaveOpen = true)
        {
            fileStartPosition = stream.Position;
            reader            = new MyBinaryReader(stream, leaveOpen);

            const string ResourcesHeaderCorrupted = "Resources header corrupted.";

            // Read ResourceManager header
            // Check for magic number
            int magicNum = reader.ReadInt32();

            if (magicNum != MagicNumber)
            {
                throw new BadImageFormatException("Not a .resources file - invalid magic number");
            }
            // Assuming this is ResourceManager header V1 or greater, hopefully
            // after the version number there is a number of bytes to skip
            // to bypass the rest of the ResMgr header. For V2 or greater, we
            // use this to skip to the end of the header
            int resMgrHeaderVersion = reader.ReadInt32();
            int numBytesToSkip      = reader.ReadInt32();

            if (numBytesToSkip < 0 || resMgrHeaderVersion < 0)
            {
                throw new BadImageFormatException(ResourcesHeaderCorrupted);
            }
            if (resMgrHeaderVersion > 1)
            {
                reader.BaseStream.Seek(numBytesToSkip, SeekOrigin.Current);
            }
            else
            {
                // We don't care about numBytesToSkip; read the rest of the header

                // readerType:
                reader.ReadString();
                // resourceSetType:
                reader.ReadString();
            }

            // Read RuntimeResourceSet header
            // Do file version check
            version = reader.ReadInt32();
            if (version != ResourceSetVersion && version != 1)
            {
                throw new BadImageFormatException($"Unsupported resource set version: {version}");
            }

            numResources = reader.ReadInt32();
            if (numResources < 0)
            {
                throw new BadImageFormatException(ResourcesHeaderCorrupted);
            }

            // Read type positions into type positions array.
            // But delay initialize the type table.
            int numTypes = reader.ReadInt32();

            if (numTypes < 0)
            {
                throw new BadImageFormatException(ResourcesHeaderCorrupted);
            }
            typeTable = new string[numTypes];
            for (int i = 0; i < numTypes; i++)
            {
                typeTable[i] = reader.ReadString();
            }

            // Prepare to read in the array of name hashes
            //  Note that the name hashes array is aligned to 8 bytes so
            //  we can use pointers into it on 64 bit machines. (4 bytes
            //  may be sufficient, but let's plan for the future)
            //  Skip over alignment stuff.  All public .resources files
            //  should be aligned   No need to verify the byte values.
            long pos        = reader.BaseStream.Position - fileStartPosition;
            int  alignBytes = unchecked ((int)pos) & 7;

            if (alignBytes != 0)
            {
                for (int i = 0; i < 8 - alignBytes; i++)
                {
                    reader.ReadByte();
                }
            }

            // Skip over the array of name hashes
            try
            {
                reader.Seek(checked (4 * numResources), SeekOrigin.Current);
            }
            catch (OverflowException)
            {
                throw new BadImageFormatException(ResourcesHeaderCorrupted);
            }

            // Read in the array of relative positions for all the names.
            namePositions = new int[numResources];
            for (int i = 0; i < numResources; i++)
            {
                int namePosition = reader.ReadInt32();
                if (namePosition < 0)
                {
                    throw new BadImageFormatException(ResourcesHeaderCorrupted);
                }
                namePositions[i] = namePosition;
            }

            // Read location of data section.
            int dataSectionOffset = reader.ReadInt32();

            if (dataSectionOffset < 0)
            {
                throw new BadImageFormatException(ResourcesHeaderCorrupted);
            }

            // Store current location as start of name section
            nameSectionPosition = reader.BaseStream.Position;
            dataSectionPosition = fileStartPosition + dataSectionOffset;

            // _nameSectionOffset should be <= _dataSectionOffset; if not, it's corrupt
            if (dataSectionPosition < nameSectionPosition)
            {
                throw new BadImageFormatException(ResourcesHeaderCorrupted);
            }
        }
        public List <IConstant> Parse(MyBinaryReader reader)
        {
            // заполняем первый индекс заглушкой, т.к. здесь нумерация с единицы
            var pool = new List <IConstant>(_poolCount)
            {
                null
            };

            while (_poolCount - pool.Count > 0)
            {
                switch ((Tags)reader.ReadByte())
                { // Здесь всем методам будем передавать index + 1
                case Tags.CONSTANT_Class:
                    // parse 2byte name_index
                    pool.Add(new ClassInfo(reader.ReadUInt16()));
                    break;

                case Tags.CONSTANT_Fieldref:
                case Tags.CONSTANT_Methodref:
                case Tags.CONSTANT_InterfaceMethodref:
                    // u2 class_index
                    // u2 name_and_type_index
                    pool.Add(new FiMeInRef(reader.ReadUInt16(), reader.ReadUInt16()));
                    break;

                case Tags.CONSTANT_String:
                    // u2 string_index
                    pool.Add(new StringRef(reader.ReadUInt16()));
                    break;

                case Tags.CONSTANT_Integer:
                    // u4 bytes
                    pool.Add(ParseIntegerConstant(reader));
                    //index += 4;
                    break;

                case Tags.CONSTANT_Float:     // Не знаю, что будет с float, попробую не пользоваться формулой s * m * 2**(e-150)
                    // u4 bytes
                    pool.Add(ParseFloatConstant(reader));
                    //index += 4;
                    break;

                case Tags.CONSTANT_Long:
                case Tags.CONSTANT_Double:
                    var pair = ParseLongOrDoubleConstant(reader);
                    pool.Add(pair.Item1);
                    pool.Add(pair.Item2);
                    //index += 8;
                    break;

                case Tags.CONSTANT_NameAndType:
                    // u2 name_index
                    // u2 descriptor_index
                    pool.Add(new NameAndTypeInfo(reader.ReadUInt16(), reader.ReadUInt16()));
                    break;

                case Tags.CONSTANT_Utf8:
                    var length   = reader.ReadUInt16();
                    var fragment = reader.ReadBytes(length);
                    pool.Add(ParseUtfStrings(fragment, length));
                    break;

                case Tags.CONSTANT_MethodHandle:
                    // u1 reference_kind in range(1 to 9)
                    // u2 reference_index
                    pool.Add(new MethodHandle(reader.ReadByte(), reader.ReadUInt16()));     // Надо бы валидацию
                    break;

                case Tags.CONSTANT_MethodType:
                    // u2 descriptor_index
                    pool.Add(new MethodType(reader.ReadUInt16()));
                    break;

                case Tags.CONSTANT_InvokeDynamic:
                    // u2 bootstrap_method_attr_index
                    // u2 name_and_type_index
                    pool.Add(new InvokeDynamic(reader.ReadUInt16(), reader.ReadUInt16()));
                    break;
                }
            }

            return(pool);
        }