diff -r c7c26511138f -r 360bd6b35136 imgtools/imglib/inc/pe_file.h --- 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 -#include -#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 +#include +#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