--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/inc/pe_file.h Tue Oct 27 16:36:35 2009 +0000
@@ -0,0 +1,184 @@
+/*
+* 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