示例#1
0
        public SIContentROM(SIROM aImage)
            : base(aImage)
        {
            SIHeaderROM header = (SIHeaderROM)aImage.Header;

            base.RelocationAddress = header.RomBaseAddress;
        }
示例#2
0
        public static bool IsROM(Stream aStream)
        {
            bool ret = false;

            //
            try
            {
                ret = SIHeaderROM.IsROM(aStream);
            }
            catch (Exception)
            {
            }
            //
            return(ret);
        }
示例#3
0
        public SIROM(ITracer aTracer, Stream aStream, string aName)
            : base(aTracer, new SIStream(aStream), aName)
        {
            base.Trace("[SymbianImageROM] Ctor() - START");

            // Read the header and set base class relocation address
            iHeader = new SIHeaderROM(this, aStream);

            // We treat ourselves as one giant blob
            SIContentROM file = new SIContentROM(this);

            base.RegisterFile(file);

            base.Trace("[SymbianImageROM] Ctor() - END");
        }
示例#4
0
        private void DoDecompressBytePair()
        {
            if (iContentIsPrepared == false)
            {
                SIHeaderROM imageHeader = ImageHeader;
                base.Trace("[SymbianImageROM] DoDecompressBytePair() - START - header uncompressed rom size: {0}", imageHeader.UncompressedRomSize);

                // Create new buffer and copy over rom image header
                SIMemoryStream resultantDataStream = new SIMemoryStream(imageHeader.UncompressedRomSize);

                int  numPages        = imageHeader.NumberOfPages;
                uint pageTableOffset = imageHeader.RomPageIndexOffset;
                uint romDataOffset   = imageHeader.HeaderSizeLoader;
                base.Trace("[SymbianImageROM] DoDecompressBytePair() - numPages: {0}, pageTableOffset: {1}, romDataOffset: {2}", numPages, pageTableOffset, romDataOffset);
                //
                SymbianDecompressor decompressor = SymbianDecompressor.NewByType(TSymbianCompressionType.EBytePair);
                //
                List <SRomPageInfo> pages = new List <SRomPageInfo>(numPages + 1);
                for (int i = 0; i < numPages; i++)
                {
                    // Read a page table entry
                    long pageOffsetWithinFile = pageTableOffset + (i * SRomPageInfo.Size);

                    //base.Trace( "[SymbianImageROM] DoDecompressBytePair() - page[{0:d5}] - pageOffsetWithinFile: {1}", i, pageOffsetWithinFile );
                    base.ImageStream.Seek(pageOffsetWithinFile, SeekOrigin.Begin);
                    SRomPageInfo pageInfo = SRomPageInfo.New((Stream)base.ImageStream, romDataOffset);

                    // Process the entry based upon the compression type
                    //base.Trace( "[SymbianImageROM] DoDecompressBytePair() - page[{0:d5}] - pageInfo.DataSize: {1}, pageInfo.DataStart: {2}, pageInfo.CompressionType: {3}", i, pageInfo.DataSize, pageInfo.DataStart, pageInfo.CompressionType );
                    base.ImageStream.Seek(pageInfo.DataStart, SeekOrigin.Begin);

                    if (pageInfo.CompressionType == SRomPageInfo.TSymbianCompressionType.ENoCompression)
                    {
                        // Read data - no decompression needed
                        //base.Trace( "[SymbianImageROM] DoDecompressBytePair() - page[{0:d5}] - PAGE NOT COMPRESSED", i );
                        resultantDataStream.Write(base.ImageStream, (int)pageInfo.DataSize);
                    }
                    else if (pageInfo.CompressionType == SRomPageInfo.TSymbianCompressionType.EBytePair)
                    {
                        //base.Trace( "[SymbianImageROM] DoDecompressBytePair() - page[{0:d5}] - BYTE PAIR PAGE", i );

                        // Read data - need to decompress it
                        byte[] compressedData = new byte[pageInfo.DataSize];
                        base.ImageStream.Read(compressedData, 0, compressedData.Length);

                        // Make destination buffer - which is a page big
                        byte[] uncompressedData = new byte[SRomPageInfo.KPageSize];

                        // Decompress to buffer - we're handling the page management, so we want raw decompression
                        int error = decompressor.DecompressRaw(compressedData, uncompressedData);

                        // Save it
                        if (error < 0)
                        {
                            base.Trace("[SymbianImageROM] DoDecompressBytePair() - page[{0:d5}] - Exception - bytepair decompression error", i);
                            throw new Exception("BytePair decompression error: " + error.ToString());
                        }
                        else if (error != SRomPageInfo.KPageSize)
                        {
                            base.Trace("[SymbianImageROM] DoDecompressBytePair() - page[{0:d5}] - Exception - bytepair underflow error", i);
                            throw new Exception("Decompressor underflow - only created " + error.ToString() + " bytes");
                        }
                        else
                        {
                            resultantDataStream.Write(uncompressedData);
                        }
                    }
                    else
                    {
                        base.Trace("[SymbianImageROM] DoDecompressBytePair() - page[{0:d5}] - UNSUPPORTED COMPRESSION TYPE - Exception!", i);
                        throw new NotSupportedException("Unsupported page compression type");
                    }

                    // Report progress
                    base.ReportDecompressionEvent(TDecompressionEvent.EEventDecompressionProgress, ((float)i / (float)numPages) * 100);
                }

                // Now we can replace the base class stream (which is just the raw compressed file data) with the new uncompressed version
                base.ImageStream   = resultantDataStream;
                iContentIsPrepared = true;

                base.Trace("[SymbianImageROM] DoDecompressBytePair() - END");
            }
        }