launcher/inc/e32imageheaders.h
branchRCL_3
changeset 19 b3cee849fa46
parent 18 48060abbbeaf
child 20 fad26422216a
--- a/launcher/inc/e32imageheaders.h	Thu Aug 19 09:55:38 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,534 +0,0 @@
-/*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:  
-*
-*/
-
-
-
-#ifndef __LAUNCHERE32IMAGEHEADERS_H__
-#define __LAUNCHERE32IMAGEHEADERS_H__
-
-#include <e32uid.h>
-
-/** Bit output stream.
-	Good for writing bit streams for packed, compressed or huffman data algorithms.
-
-	This class must be derived from and OverflowL() reimplemented if the bitstream data
-	cannot be generated into a single memory buffer.
-*/
-class TBitOutput
-	{
-public:
-	IMPORT_C TBitOutput();
-	IMPORT_C TBitOutput(TUint8* aBuf,TInt aSize);
-	inline void Set(TUint8* aBuf,TInt aSize);
-	inline const TUint8* Ptr() const;
-	inline TInt BufferedBits() const;
-//
-	IMPORT_C void WriteL(TUint aValue, TInt aLength);
-	IMPORT_C void HuffmanL(TUint aHuffCode);
-	IMPORT_C void PadL(TUint aPadding);
-private:
-	void DoWriteL(TUint aBits, TInt aSize);
-	virtual void OverflowL();
-private:
-	TUint iCode;		// code in production
-	TInt iBits;
-	TUint8* iPtr;
-	TUint8* iEnd;
-	};
-
-/** Set the memory buffer to use for output
-
-	Data will be written to this buffer until it is full, at which point OverflowL() will
-	be called. This should handle the data and then can Set() again to reset the buffer
-	for further output.
-	
-	@param aBuf The buffer for output
-	@param aSize The size of the buffer in bytes
-*/
-inline void TBitOutput::Set(TUint8* aBuf,TInt aSize)
-	{iPtr=aBuf;iEnd=aBuf+aSize;}
-	
-/** Get the current write position in the output buffer
-
-	In conjunction with the address of the buffer, which should be known to the
-	caller, this describes the data in the bitstream.
-*/
-inline const TUint8* TBitOutput::Ptr() const
-	{return iPtr;}
-	
-/** Get the number of bits that are buffered
-
-	This reports the number of bits that have not yet been written into the
-	output buffer. It will always lie in the range 0..7. Use PadL() to
-	pad the data out to the next byte and write it to the buffer.
-*/
-inline TInt TBitOutput::BufferedBits() const
-	{return iBits+8;}
-
-
-/** Bit input stream. Good for reading bit streams for packed, compressed or huffman
-	data algorithms.
-*/
-class TBitInput
-	{
-public:
-	IMPORT_C TBitInput();
-	IMPORT_C TBitInput(const TUint8* aPtr, TInt aLength, TInt aOffset=0);
-	IMPORT_C void Set(const TUint8* aPtr, TInt aLength, TInt aOffset=0);
-//
-	IMPORT_C TUint ReadL();
-	IMPORT_C TUint ReadL(TInt aSize);
-	IMPORT_C TUint HuffmanL(const TUint32* aTree);
-private:
-	virtual void UnderflowL();
-private:
-	TInt iCount;
-	TUint iBits;
-	TInt iRemain;
-	const TUint32* iPtr;
-	};
-
-/** Huffman code toolkit.
-
-	This class builds a huffman encoding from a frequency table and builds
-	a decoding tree from a code-lengths table
-
-	The encoding generated is based on the rule that given two symbols s1 and s2, with 
-	code length l1 and l2, and huffman codes h1 and h2:
-
-		if l1<l2 then h1<h2 when compared lexicographically
-		if l1==l2 and s1<s2 then h1<h2 ditto
-
-	This allows the encoding to be stored compactly as a table of code lengths
-*/
-class Huffman
-	{
-public:
-	enum {KMaxCodeLength=27};
-	enum {KMetaCodes=KMaxCodeLength+1};
-	enum {KMaxCodes=0x8000};
-public:
-	IMPORT_C static void HuffmanL(const TUint32 aFrequency[],TInt aNumCodes,TUint32 aHuffman[]);
-	IMPORT_C static void Encoding(const TUint32 aHuffman[],TInt aNumCodes,TUint32 aEncodeTable[]);
-	IMPORT_C static void Decoding(const TUint32 aHuffman[],TInt aNumCodes,TUint32 aDecodeTree[],TInt aSymbolBase=0);
-	IMPORT_C static TBool IsValid(const TUint32 aHuffman[],TInt aNumCodes);
-//
-	IMPORT_C static void ExternalizeL(TBitOutput& aOutput,const TUint32 aHuffman[],TInt aNumCodes);
-	IMPORT_C static void InternalizeL(TBitInput& aInput,TUint32 aHuffman[],TInt aNumCodes);
-	};
-
-
-enum TCpu
-	{
-	ECpuUnknown=0, ECpuX86=0x1000, ECpuArmV4=0x2000, ECpuArmV5=0x2001, ECpuArmV6=0x2002, ECpuMCore=0x4000
-	};
-	
-const TInt KOrdinalBase=1;
-const TUint KImageDll				= 0x00000001u;
-const TUint KImageNoCallEntryPoint	= 0x00000002u;
-const TUint KImageFixedAddressExe	= 0x00000004u;
-const TUint KImageOldJFlag			= 0x00000008u;	// so we can run binaries built with pre 2.00 tools (hdrfmt=0)
-const TUint KImageOldElfFlag		= 0x00000010u;	// so we can run binaries built with pre 2.00 tools (hdrfmt=0)
-const TUint KImageABIMask			= 0x00000018u;	// only if hdr fmt not zero
-const TInt	KImageABIShift			= 3;
-const TUint	KImageABI_GCC98r2		= 0x00000000u;	// for ARM
-const TUint	KImageABI_EABI			= 0x00000008u;	// for ARM
-const TUint KImageEptMask			= 0x000000e0u;	// entry point type
-const TInt	KImageEptShift			= 5;
-const TUint KImageEpt_Eka1			= 0x00000000u;
-const TUint KImageEpt_Eka2			= 0x00000020u;
-const TUint KImageHdrFmtMask		= 0x0f000000u;
-const TInt	KImageHdrFmtShift		= 24;
-const TUint KImageHdrFmt_Original	= 0x00000000u;	// without compression support
-const TUint KImageHdrFmt_J			= 0x01000000u;	// with compression support
-const TUint KImageHdrFmt_V			= 0x02000000u;	// with versioning support
-const TUint KImageImpFmtMask		= 0xf0000000u;
-const TInt	KImageImpFmtShift		= 28;
-const TUint KImageImpFmt_PE			= 0x00000000u;	// PE-derived imports
-const TUint KImageImpFmt_ELF		= 0x10000000u;	// ELF-derived imports
-const TUint KImageImpFmt_PE2		= 0x20000000u;	// PE-derived imports without redundant copy of import ordinals
-const TUint KImageHWFloatMask		= 0x00f00000u;
-const TInt	KImageHWFloatShift		= 20;
-const TUint	KImageHWFloat_None		= EFpTypeNone << KImageHWFloatShift; // No hardware floating point used
-const TUint KImageHWFloat_VFPv2		= EFpTypeVFPv2 << KImageHWFloatShift; // ARM VFPv2 floating point used
-
-const TUint KMyFormatNotCompressed=0;
-const TUint KMyUidCompressionDeflate=0x101F7AFC;
-
-const TUint32 KImageCrcInitialiser	= 0xc90fdaa2u;
-/*
-const TUint16 KReservedRelocType        = (TUint16)0x0000;
-const TUint16 KTextRelocType            = (TUint16)0x1000;
-const TUint16 KDataRelocType            = (TUint16)0x2000;
-const TUint16 KInferredRelocType        = (TUint16)0x3000;
-*/
-class RFile;
-class E32ImageHeader
-	{
-public:
-	inline static TUint ABIFromFlags(TUint aFlags)
-		{
-		if (aFlags&KImageHdrFmtMask)
-			return aFlags & KImageABIMask;
-		if (aFlags&KImageOldElfFlag)
-			return KImageABI_EABI;
-		return KImageABI_GCC98r2;
-		}
-	inline static TUint EptFromFlags(TUint aFlags)
-		{
-		if (aFlags&KImageHdrFmtMask)
-			return aFlags & KImageEptMask;
-		if (aFlags&KImageOldJFlag)
-			return KImageEpt_Eka2;
-		return KImageEpt_Eka1;
-		}
-	inline static TUint HdrFmtFromFlags(TUint aFlags)
-		{
-		if (aFlags&KImageHdrFmtMask)
-			return aFlags & KImageHdrFmtMask;
-		if (aFlags&KImageOldJFlag)
-			return KImageHdrFmt_J;
-		return KImageHdrFmt_Original;
-		}
-	inline static TUint ImpFmtFromFlags(TUint aFlags)
-		{
-		if (aFlags&KImageHdrFmtMask)
-			return aFlags & KImageImpFmtMask;
-		if (aFlags&KImageOldElfFlag)
-			return KImageImpFmt_ELF;
-		return KImageImpFmt_PE;
-		}
-	inline TUint32 CompressionType() const
-		{
-		if (HdrFmtFromFlags(iFlags) >= KImageHdrFmt_J)
-			return iCompressionType;
-		return 0;
-		}
-	inline TUint32 ModuleVersion() const
-		{
-		if ((iFlags & KImageHdrFmtMask) >= KImageHdrFmt_V)
-			return iModuleVersion;
-		return 0x00000000u;
-		}
-	inline TInt TotalSize() const;
-	inline TInt UncompressedFileSize() const;
-	inline TUint HeaderFormat() const
-		{ return HdrFmtFromFlags(iFlags); }
-	inline TUint EntryPointFormat() const
-		{ return EptFromFlags(iFlags); }
-	inline TUint ImportFormat() const
-		{ return ImpFmtFromFlags(iFlags); }
-	inline TUint ABI() const
-		{ return ABIFromFlags(iFlags); }
-	inline void GetSecurityInfo(SSecurityInfo& aInfo) const;
-	inline TCpu CpuIdentifier() const;
-	inline TProcessPriority ProcessPriority() const;
-	inline TUint32 ExceptionDescriptor() const;
-	TInt IntegrityCheck(TInt aFileSize);
-	static TInt New(E32ImageHeader*& aHdr, RFile& aFile);
-public:
-	TUint32	iUid1;
-	TUint32	iUid2;
-	TUint32	iUid3;
-	TUint32 iUidChecksum;
-	TUint iSignature;			// 'EPOC'
-	TUint32	iHeaderCrc;			// CRC-32 of entire header
-	TUint32 iModuleVersion;		// Version number for this executable (used in link resolution)
-	TUint32 iCompressionType;	// Type of compression used (UID or 0 for none)
-	TVersion iToolsVersion;		// Version of PETRAN/ELFTRAN which generated this file
-	TUint32 iTimeLo;
-	TUint32 iTimeHi;
-	TUint iFlags;				// 0 = exe, 1 = dll, 2 = fixed address exe
-	TInt iCodeSize;				// size of code, import address table, constant data and export dir
-	TInt iDataSize;				// size of initialised data
-	TInt iHeapSizeMin;
-	TInt iHeapSizeMax;
-	TInt iStackSize;
-	TInt iBssSize;
-	TUint iEntryPoint;			// offset into code of entry point
-	TUint iCodeBase;			// where the code is linked for	
-	TUint iDataBase;			// where the data is linked for
-	TInt iDllRefTableCount;		// filling this in enables E32ROM to leave space for it
-	TUint iExportDirOffset;		// offset into the file of the export address table
-	TInt iExportDirCount;
-	TInt iTextSize;				// size of just the text section, also doubles as the offset for the iat w.r.t. the code section
-	TUint iCodeOffset;			// file offset to code section, also doubles as header size
-	TUint iDataOffset;			// file offset to data section
-	TUint iImportOffset;		// file offset to import section
-	TUint iCodeRelocOffset;		// relocations for code and const
-	TUint iDataRelocOffset;		// relocations for data
-	TUint16 iProcessPriority;	// executables priority
-	TUint16 iCpuIdentifier;		// 0x1000 = X86, 0x2000 = ARM
-	};
-
-class E32ImageHeaderComp : public E32ImageHeader
-	{
-public:
-	TUint32 iUncompressedSize;	// Uncompressed size of file
-								// For J format this is file size - sizeof(E32ImageHeader)
-								//  and this is included as part of the compressed data :-(
-								// For other formats this is file size - total header size
-	};
-
-class E32ImageHeaderV : public E32ImageHeaderComp
-	{
-public:
-	SSecurityInfo iS;
-
-	// Use iSpare1 as offset to Exception Descriptor
-	TUint32 iExceptionDescriptor;   // Offset in bytes from start of code section to Exception Descriptor, bit 0 set if valid
-	TUint32 iSpare2;
-	TUint16	iExportDescSize;	// size of bitmap section
-	TUint8	iExportDescType;	// type of description of holes in export table
-	TUint8	iExportDesc[1];		// description of holes in export table - extend
-	};
-
-// export description type
-const TUint	KImageHdr_ExpD_NoHoles			=0x00;	// no holes, all exports present
-const TUint	KImageHdr_ExpD_FullBitmap		=0x01;	// full bitmap present
-const TUint	KImageHdr_ExpD_SparseBitmap8	=0x02;	// sparse bitmap present, granularity 8
-const TUint	KImageHdr_ExpD_Xip				=0xff;	// XIP file
-
-
-inline TInt E32ImageHeader::TotalSize() const
-	{
-	if (HeaderFormat() == KImageHdrFmt_J && iCompressionType != 0)
-		return sizeof(E32ImageHeaderComp);
-	return iCodeOffset;
-	}
-
-inline TInt E32ImageHeader::UncompressedFileSize() const
-	{
-	TUint hdrfmt = HeaderFormat();
-	if (hdrfmt == KImageHdrFmt_Original || iCompressionType == 0)
-		return -1;			// not compressed
-	else if (hdrfmt == KImageHdrFmt_J)
-		return ((E32ImageHeaderComp*)this)->iUncompressedSize + sizeof(E32ImageHeader);
-	else
-		return ((E32ImageHeaderComp*)this)->iUncompressedSize + iCodeOffset;
-	}
-
-extern const SSecurityInfo KDefaultSecurityInfo;
-inline void E32ImageHeader::GetSecurityInfo(SSecurityInfo& aInfo) const
-	{
-	if (HeaderFormat() >= KImageHdrFmt_V)
-		aInfo = ((E32ImageHeaderV*)this)->iS;
-	else
-		aInfo = KDefaultSecurityInfo;
-	}
-
-inline TCpu E32ImageHeader::CpuIdentifier() const
-	{
-	if (HeaderFormat() >= KImageHdrFmt_V)
-		return (TCpu)iCpuIdentifier;
-	return (TCpu)iHeaderCrc;
-	}
-
-inline TProcessPriority E32ImageHeader::ProcessPriority() const
-	{
-	if (HeaderFormat() >= KImageHdrFmt_V)
-		return (TProcessPriority)iProcessPriority;
-	return *(const TProcessPriority*)&iProcessPriority;
-	}
-
-inline TUint32 E32ImageHeader::ExceptionDescriptor() const
-	{
-	if (HeaderFormat() >= KImageHdrFmt_V)
-		{
-		TUint32 xd = ((E32ImageHeaderV*)this)->iExceptionDescriptor;
-		if ((xd & 1) && (xd != 0xffffffffu))
-			return (xd & ~1);
-		}
-	return 0;
-	}
-
-class E32ImportBlock
-	{
-public:
-	inline const E32ImportBlock* NextBlock(TUint aImpFmt) const;
-	inline TInt Size(TUint aImpFmt) const;
-	inline const TUint* Imports() const;	// import list if present
-public:
-	TUint32	iOffsetOfDllName;	// offset of name of dll importing from
-	TInt	iNumberOfImports;	// no of imports from this dll
-//	TUint	iImport[iNumberOfImports];	// list of imported ordinals, omitted in PE2 import format
-	};
-
-inline TInt E32ImportBlock::Size(TUint aImpFmt) const
-	{
-	TInt r = sizeof(E32ImportBlock);
-	if (aImpFmt!=KImageImpFmt_PE2)
-		r += iNumberOfImports * sizeof(TUint);
-	return r;
-	}
-
-inline const E32ImportBlock* E32ImportBlock::NextBlock(TUint aImpFmt) const
-	{
-	const E32ImportBlock* next = this + 1;
-	if (aImpFmt!=KImageImpFmt_PE2)
-		next = (const E32ImportBlock*)( (TUint8*)next + iNumberOfImports * sizeof(TUint) );
-	return next;
-	}
-
-inline const TUint* E32ImportBlock::Imports() const
-	{
-	return (const TUint*)(this + 1);
-	}
-
-class E32ImportSection
-	{
-public:
-	TInt iSize;					// size of this section
-//	E32ImportBlock[iDllRefTableCount];
-	};
-
-class E32RelocSection
-	{
-public:
-	TInt iSize;					// size of this relocation section
-	TInt iNumberOfRelocs;		// number of relocations in this section
-	};
-
-
-typedef TUint8* (*TMemoryMoveFunction)(TAny* aTrg,const TAny* aSrc,TInt aLength);
-
-const TInt KDeflateLengthMag=8;
-const TInt KDeflateDistanceMag=12;
-const TInt KDeflateMinLength=3;
-const TInt KDeflateMaxLength=KDeflateMinLength-1 + (1<<KDeflateLengthMag);
-const TInt KDeflateMaxDistance=(1<<KDeflateDistanceMag);
-const TInt KDeflateDistCodeBase=0x200;
-const TUint KDeflateHashMultiplier=0xAC4B9B19u;
-const TInt KDeflateHashShift=24;
-const TInt KInflateWindowSize=0x8000;
-
-
-class TEncoding
-	{
-public:
-	enum {ELiterals=256,ELengths=(KDeflateLengthMag-1)*4,ESpecials=1,EDistances=(KDeflateDistanceMag-1)*4};
-	enum {ELitLens=ELiterals+ELengths+ESpecials};
-	enum {EEos=ELiterals+ELengths};
-public:
-	TUint32 iLitLen[ELitLens];
-	TUint32 iDistance[EDistances];
-	};
-
-const TInt KDeflationCodes=TEncoding::ELitLens+TEncoding::EDistances;
-
-NONSHARABLE_CLASS(CInflater) : public CBase
-	{
-public:
-	enum {EBufSize = 0x800, ESafetyZone=8};
-public:
-	static CInflater* NewLC(TBitInput& aInput);
-	~CInflater();
-	TInt ReadL(TUint8* aBuffer,TInt aLength, TMemoryMoveFunction aMemMovefn);
-	TInt SkipL(TInt aLength);
-private:
-	CInflater(TBitInput& aInput);
-	void ConstructL();
-	void InitL();
-	TInt InflateL();
-private:
-	TBitInput* iBits;
-	const TUint8* iRptr;			
-	TInt iLen;
-	const TUint8* iAvail;		
-	const TUint8* iLimit;
-	TEncoding* iEncoding;
-	TUint8* iOut;				
-	};
-
-void DeflateL(const TUint8* aBuf, TInt aLength, TBitOutput& aOutput);
-
-	
-NONSHARABLE_CLASS(TFileInput) : public TBitInput
-	{
- 	enum {KBufSize=KInflateWindowSize};
-public:
-	TFileInput(RFile& aFile);
-	void Cancel();
-private:
-	void UnderflowL();
-private:
-	RFile& iFile;
-	TRequestStatus iStat;
-	TUint8* iReadBuf;
-	TPtr8 iPtr;
-	TUint8 iBuf1[KBufSize];
-	TUint8 iBuf2[KBufSize];
-	};
-
-class TFileNameInfo
-	{
-public:
-	enum
-    	{
-    	EIncludeDrive=1,
-    	EIncludePath=2,
-    	EIncludeBase=4,
-    	EIncludeVer=8,
-    	EForceVer=16,
-    	EIncludeUid=32,
-    	EForceUid=64,
-    	EIncludeExt=128,
-    	EIncludeDrivePath=EIncludeDrive|EIncludePath,
-    	EIncludeBaseExt=EIncludeBase|EIncludeExt,
-    	EIncludeDrivePathBaseExt=EIncludeDrive|EIncludePath|EIncludeBase|EIncludeExt,
-    	};
-	enum
-		{
-		EAllowUid=1,
-		EAllowPlaceholder=2,
-		EAllowDecimalVersion=4,
-		};
-public:
-	TFileNameInfo();
-	TInt Set(const TDesC8& aFileName, TUint aFlags);
-	void Dump() const;
-public:
-	inline TInt DriveLen() const {return iPathPos;}
-	inline TInt PathLen() const {return iBasePos-iPathPos;}
-	inline TInt BaseLen() const {return iVerPos-iBasePos;}
-	inline TInt VerLen() const {return iUidPos-iVerPos;}
-	inline TInt UidLen() const {return iExtPos-iUidPos;}
-	inline TInt ExtLen() const {return iLen-iExtPos;}
-	inline TPtrC8 Drive() const {return TPtrC8(iName, iPathPos);}
-	inline TPtrC8 Path() const {return TPtrC8(iName+iPathPos, iBasePos-iPathPos);}
-	inline TPtrC8 DriveAndPath() const {return TPtrC8(iName, iBasePos);}
-	inline TPtrC8 Base() const {return TPtrC8(iName+iBasePos, iVerPos-iBasePos);}
-	inline TPtrC8 VerStr() const {return TPtrC8(iName+iVerPos, iUidPos-iVerPos);}
-	inline TPtrC8 UidStr() const {return TPtrC8(iName+iUidPos, iExtPos-iUidPos);}
-	inline TPtrC8 Ext() const {return TPtrC8(iName+iExtPos, iLen-iExtPos);}
-	inline TUint32 Version() const {return iVersion;}
-	inline TUint32 Uid() const {return iUid;}
-	void GetName(TDes8& aName, TUint aFlags) const;
-public:
-	const TText8* iName;
-	TInt iPathPos;
-	TInt iBasePos;
-	TInt iVerPos;
-	TInt iUidPos;
-	TInt iExtPos;
-	TInt iLen;
-	TUint32 iVersion;
-	TUint32 iUid;
-	};
-
-
-#endif // __LAUNCHERE32IMAGEHEADERS_H__