public SIContentROM(SIROM aImage) : base(aImage) { SIHeaderROM header = (SIHeaderROM)aImage.Header; base.RelocationAddress = header.RomBaseAddress; }
public static bool IsROM(Stream aStream) { bool ret = false; // try { ret = SIHeaderROM.IsROM(aStream); } catch (Exception) { } // return(ret); }
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"); }
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"); } }