imgtools/imglib/inc/pe_file.h
changeset 590 360bd6b35136
parent 0 044383f39525
--- a/imgtools/imglib/inc/pe_file.h	Wed Jun 16 16:51:40 2010 +0300
+++ b/imgtools/imglib/inc/pe_file.h	Wed Jun 23 16:56:47 2010 +0800
@@ -1,184 +1,178 @@
-/*
-* Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "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: 
-*
-*/
-
-
-#if !defined(__PE_FILE_H__)
-#define __PE_FILE_H__
-#include <e32rom.h>
-#include <e32image.h>
-#include "pe_defs.h"
-//
-const TInt KTextSection=0;
-const TInt KConstSection=1;
-const TInt KExportSection=2;
-const TInt KDataSection=3;
-const TInt KBssSection=4;
-const TInt KImportSection=5;
-const TInt KCrtSection=6;
-const TInt KRelocSection=7;
-const TInt KNumberOfSections=8;
-//
-enum TImportStat {EImpError, EImpSuccess, EImpDone};
-//
-class PEFile
-	{
-public:
-	PEFile();
-	~PEFile();
-	TBool Init(const TText * const aFileName);
-	void Close();
-	//
-	TImportStat GetNextImport(TText * &aDllName, TUint16 &aOrdinal, TUint32 * &aThunkPtr);
-	TUint32 GetFixUp(const TUint16 aOrdinal);
-// 	TText *GetImageName();
-//	TUint8 *GetExportName(const TUint16 aOrdinal);
-//	TUint32 WriteDllRefTable(PEFile aPeArray[], TUint aMaxFiles);
-	void RelocateExportTable();
-	TUint GetNumberOfExportedFunctions();
-	TUint GetOrdinalBase();
-	TBool ExportSectionExists();
-	TBool ImportSectionExists();
-	TUint RoundToSectionSize(TUint aSize);
-	void DumpPeHeaders();
-	//
-	TInt Normalise();
-	void GetRelocs(TUint *aReloc, TUint *aRelocSection, TInt aNumberOfRelocs);
-	TInt ReadSectionHeaders();
-	TInt ReadData();
-	TInt ReadExportDirectory();
-	char *ReadSectionData(PIMAGE_SECTION_HEADER aHeader);
-	TInt NumberOfImports() const;
-	TInt NumberOfImportDlls() const;
-	TInt NumberOfExports() const;
-	TInt NumberOfRelocs();
-public:
-	static TInt CmpSectionName(PIMAGE_SECTION_HEADER apSectionHeader, char *aName);
-	TInt VirtualAddressInSection(TUint aVA, PIMAGE_SECTION_HEADER aHeader);
-	TUint DistanceFromSection(TUint aVA, PIMAGE_SECTION_HEADER aHeader);
-	TInt FindSectionByVa(TUint aVa, TUint aTryToBeClever=0);
-	static TInt HasInitialisedData(PIMAGE_SECTION_HEADER aHeader);
-	
-//	static TBool DoFixUps(PEFile aPeArray[], TUint aMaxFiles);
-//	static TBool FindByName(PEFile aPeArray[], TUint aMaxFiles,const TText * const aDllName, PEFile * &aExportPEFile);
-//	static void WriteDllRefTables(PEFile aPeArray[], TUint aMaxFiles);
-//	static void RelocateExportTables(PEFile aPeArray[], TUint aMaxFiles);
-private:
-	TBool IsInCode(TUint32 anAddr);
-	TBool IsInData(TUint32 anAddr);
-	TBool IsInDataReloc(TUint32 anAddr);
-	TBool IsInExport(TUint32 anAddr);
-	TBool IsInImport(TUint32 anAddr);
-	TBool IsValidDOSHeader(PIMAGE_DOS_HEADER pDOSHeader);
-	TBool IsValidNTHeader(PIMAGE_NT_HEADERS pNTHeader);
-	TBool IsValidFileHeader(PIMAGE_FILE_HEADER pFileHeader);
-	void DumpNextSectionInFile(PIMAGE_SECTION_HEADER pSectionHeader);
-	void CopySectionData(TAny *source, TAny *dest, TUint32 fileLength, TUint32 memLength);
-	TBool ProcessRelocData(TAny *relocData,TInt dataSize);
-	PEFile(const PEFile&);
-	const PEFile & operator = (const PEFile&);
-public:
-	static TUint32 iRomMemBase; // where the ROM is being loaded to
-	static TUint32 iRomLinearBase; // where the ROM will run
-	TUint32 iMemBase; // where this file is being loaded to
-	TUint32 iEntryPoint;
-	TUint32 iImageSize;
-	TUint32 iCodeSize;
-	TUint32 iDataSize;
-	TUint32 iHeapReservedSize;
-	TUint32 iHeapCommittedSize;
-	TUint32 iStackReservedSize;
-	TUint32 iStackCommittedSize;
-	TUint32 iBssSize;
-	TUint32 iBssOffset;
-	TUint32 iSectionAlign;
-	TUint32 iExpDirectoryOffset;
-	TUint32 iDataOffset;
-	TBool	iImageIsDll;
-private:
-	IMAGE_NT_HEADERS *iHeader;
- 	PIMAGE_EXPORT_DIRECTORY	iExpDirectory;
-	PIMAGE_IMPORT_DESCRIPTOR iImpDescriptor; 
-	TText *iFileName;
-	TInt32 iFileHandle;
-	TUint32 iLinkedBase;
-	TUint32 iStartOfHeaders; // whether DOS header or not
-	TUint32 iSizeOfHeaders; // Up to and including section headers
-	TUint32 iNumSections;
-	TUint32 iRomRunAddr; // where the code will run & rdata be accessed
-	TUint32 iRamRunAddr; // and where the data & bss will be when it does
-	TUint32 iRomDelta;
-	TUint32 iRamDelta;
-	TBool iHadDataSection;
-
-// stuff for relocating image successfully in 2 parts
-	TUint32 iBssSectionLinkedAddr;
-	TUint32 iBssSectionAddr;
-	TUint32 iBssSectionSize;
-	TUint32 iDataSectionLinkedAddr;
-	TUint32 iDataSectionAddr;
-	TUint32 iDataSectionSize;
-	TUint32 iCodeSectionAddr;
-	TUint32 iCodeSectionSize;
-	TUint32 iRDataSectionAddr;
-	TUint32 iRDataSectionSize;
-	TUint32 iCRTSectionAddr;
-	TUint32 iCRTSectionSize;
-	TUint32 iExportDataDir;
-
-// stuff for the pe->e32image translator
-	PIMAGE_SECTION_HEADER iSectionHeader[KNumberOfSections];
-	char *iSectionData[KNumberOfSections];
-	TInt iExportDirSize;
-	TInt iCpu;
-	friend class E32ImageFile;
-	friend class E32ImageFile_PE;
-	};
-
-class E32ImageFile_PE : public E32ImageFile
-	{
-public:
-	E32ImageFile_PE();
-	virtual ~E32ImageFile_PE();
-	virtual TBool Translate(const char* aFileName, TUint aDataBase, TBool aAllowDllData, TBool /*aSymLkupEnabled*/);
-	TBool Translate(PEFile &aPEFile);
-	TUint ImportAddressTableOffset();
-	TUint ConstOffset();
-private:
-	TInt DoCodeHeader(PEFile &aPeFile);
-	TInt DoDataHeader(PEFile &aPeFile, TUint aDataBase);
-	TInt CopyCode(char *aPtr, PEFile &aPeFile);
-	TInt CopyData(char *aPtr, PEFile &aPeFile);
-	TInt CopyImportAddrTable(char *aPtr, PEFile &aPeFile);
-	char *CreateImportSection(const PEFile &aPeFile, TInt &aSize);
-	void CreateExportSection(char *aPtr, PEFile &aPeFile);
-
-	void CreateExportDirectory(char *aPtr, PEFile &aPeFile);
-	void FixExportDirectory(TUint *aExportDir, PEFile &aPeFile);
-	void FixRelocs(PEFile &aPeFile, TUint *relocation, TUint *relocsection, TInt aNumberOfRelocs);
-	char *CreateCodeRelocs(TUint *reloc, TUint *relocsection, TInt nrelocs, TInt &aSize);
-	char *CreateDataRelocs(TUint *reloc, TUint *relocsection, TInt nrelocs, TInt &aSize);
-
-	TUint FixAddress(PEFile &aPeFile, TUint va);
-	TUint FixImportThunk(PEFile &aPeFile, TUint va);
-private:
-	PIMAGE_SECTION_HEADER iPeHeader[KNumberOfSections];
-	char *iPeData[KNumberOfSections];
-	TUint iConstOffset;
-	TUint iCrtOffset;
-	};
-
-#endif
+/*
+* Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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: 
+*
+*/
+
+
+#if !defined(__PE_FILE_H__)
+#define __PE_FILE_H__
+#include <e32rom.h>
+#include <e32image.h>
+#include "pe_defs.h"
+//
+const TInt KTextSection=0;
+const TInt KConstSection=1;
+const TInt KExportSection=2;
+const TInt KDataSection=3;
+const TInt KBssSection=4;
+const TInt KImportSection=5;
+const TInt KCrtSection=6;
+const TInt KRelocSection=7;
+const TInt KNumberOfSections=8;
+//
+enum TImportStat {EImpError, EImpSuccess, EImpDone};
+//
+class PEFile
+	{
+public:
+	PEFile();
+	~PEFile();
+	TBool Init(const char* aFileName);
+	void Close();
+	//
+	TImportStat GetNextImport(char * &aDllName, TUint16 &aOrdinal, TUint32 * &aThunkPtr);
+	TUint32 GetFixUp(const TUint16 aOrdinal);
+
+	void RelocateExportTable();
+	TUint GetNumberOfExportedFunctions();
+	TUint GetOrdinalBase();
+	TBool ExportSectionExists();
+	TBool ImportSectionExists();
+	TUint RoundToSectionSize(TUint aSize);
+	void DumpPeHeaders();
+	//
+	TInt Normalise();
+	void GetRelocs(TUint *aReloc, TUint *aRelocSection, TInt aNumberOfRelocs);
+	TInt ReadSectionHeaders();
+	TInt ReadData();
+	TInt ReadExportDirectory();
+	char *ReadSectionData(PIMAGE_SECTION_HEADER aHeader);
+	TInt NumberOfImports() const;
+	TInt NumberOfImportDlls() const;
+	TInt NumberOfExports() const;
+	TInt NumberOfRelocs();
+public:
+	static TInt CmpSectionName(PIMAGE_SECTION_HEADER apSectionHeader, char *aName);
+	TInt VirtualAddressInSection(TUint aVA, PIMAGE_SECTION_HEADER aHeader);
+	TUint DistanceFromSection(TUint aVA, PIMAGE_SECTION_HEADER aHeader);
+	TInt FindSectionByVa(TUint aVa, TUint aTryToBeClever=0);
+	static TInt HasInitialisedData(PIMAGE_SECTION_HEADER aHeader);
+ 
+private:
+	TBool IsInCode(TUint32 anAddr);
+	TBool IsInData(TUint32 anAddr);
+	TBool IsInDataReloc(TUint32 anAddr);
+	TBool IsInExport(TUint32 anAddr);
+	TBool IsInImport(TUint32 anAddr);
+	TBool IsValidDOSHeader(PIMAGE_DOS_HEADER pDOSHeader);
+	TBool IsValidNTHeader(PIMAGE_NT_HEADERS pNTHeader);
+	TBool IsValidFileHeader(PIMAGE_FILE_HEADER pFileHeader);
+	void DumpNextSectionInFile(PIMAGE_SECTION_HEADER pSectionHeader);
+	void CopySectionData(TAny *source, TAny *dest, TUint32 fileLength, TUint32 memLength);
+	TBool ProcessRelocData(TAny *relocData,TInt dataSize);
+	PEFile(const PEFile&);
+	const PEFile & operator = (const PEFile&);
+public:
+	static TUint32 iRomMemBase; // where the ROM is being loaded to
+	static TUint32 iRomLinearBase; // where the ROM will run
+	TUint32 iMemBase; // where this file is being loaded to
+	TUint32 iEntryPoint;
+	TUint32 iImageSize;
+	TUint32 iCodeSize;
+	TUint32 iDataSize;
+	TUint32 iHeapReservedSize;
+	TUint32 iHeapCommittedSize;
+	TUint32 iStackReservedSize;
+	TUint32 iStackCommittedSize;
+	TUint32 iBssSize;
+	TUint32 iBssOffset;
+	TUint32 iSectionAlign;
+	TUint32 iExpDirectoryOffset;
+	TUint32 iDataOffset;
+	TBool	iImageIsDll;
+private:
+	IMAGE_NT_HEADERS *iHeader;
+ 	PIMAGE_EXPORT_DIRECTORY	iExpDirectory;
+	PIMAGE_IMPORT_DESCRIPTOR iImpDescriptor; 
+	char *iFileName;
+	TInt32 iFileHandle;
+	TUint32 iLinkedBase;
+	TUint32 iStartOfHeaders; // whether DOS header or not
+	TUint32 iSizeOfHeaders; // Up to and including section headers
+	TUint32 iNumSections;
+	TUint32 iRomRunAddr; // where the code will run & rdata be accessed
+	TUint32 iRamRunAddr; // and where the data & bss will be when it does
+	TUint32 iRomDelta;
+	TUint32 iRamDelta;
+	TBool iHadDataSection;
+
+// stuff for relocating image successfully in 2 parts
+	TUint32 iBssSectionLinkedAddr;
+	TUint32 iBssSectionAddr;
+	TUint32 iBssSectionSize;
+	TUint32 iDataSectionLinkedAddr;
+	TUint32 iDataSectionAddr;
+	TUint32 iDataSectionSize;
+	TUint32 iCodeSectionAddr;
+	TUint32 iCodeSectionSize;
+	TUint32 iRDataSectionAddr;
+	TUint32 iRDataSectionSize;
+	TUint32 iCRTSectionAddr;
+	TUint32 iCRTSectionSize;
+	TUint32 iExportDataDir;
+
+// stuff for the pe->e32image translator
+	PIMAGE_SECTION_HEADER iSectionHeader[KNumberOfSections];
+	char *iSectionData[KNumberOfSections];
+	TInt iExportDirSize;
+	TInt iCpu;
+	friend class E32ImageFile;
+	friend class E32ImageFile_PE;
+	};
+
+class E32ImageFile_PE : public E32ImageFile
+	{
+public:
+	E32ImageFile_PE();
+	virtual ~E32ImageFile_PE();
+	virtual TBool Translate(const char* aFileName, TUint aDataBase, TBool aAllowDllData, TBool /*aSymLkupEnabled*/);
+	TBool Translate(PEFile &aPEFile);
+	TUint ImportAddressTableOffset();
+	TUint ConstOffset();
+private:
+	TInt DoCodeHeader(PEFile &aPeFile);
+	TInt DoDataHeader(PEFile &aPeFile, TUint aDataBase);
+	TInt CopyCode(char *aPtr, PEFile &aPeFile);
+	TInt CopyData(char *aPtr, PEFile &aPeFile);
+	TInt CopyImportAddrTable(char *aPtr, PEFile &aPeFile);
+	char *CreateImportSection(const PEFile &aPeFile, TInt &aSize);
+	void CreateExportSection(char *aPtr, PEFile &aPeFile);
+
+	void CreateExportDirectory(char *aPtr, PEFile &aPeFile);
+	void FixExportDirectory(TUint *aExportDir, PEFile &aPeFile);
+	void FixRelocs(PEFile &aPeFile, TUint *relocation, TUint *relocsection, TInt aNumberOfRelocs);
+	char *CreateCodeRelocs(TUint *reloc, TUint *relocsection, TInt nrelocs, TInt &aSize);
+	char *CreateDataRelocs(TUint *reloc, TUint *relocsection, TInt nrelocs, TInt &aSize);
+
+	TUint FixAddress(PEFile &aPeFile, TUint va);
+	TUint FixImportThunk(PEFile &aPeFile, TUint va);
+private:
+	PIMAGE_SECTION_HEADER iPeHeader[KNumberOfSections];
+	char *iPeData[KNumberOfSections];
+	TUint iConstOffset;
+	TUint iCrtOffset;
+	};
+
+#endif