diff -r 000000000000 -r a41df078684a userlibandfileserver/fileserver/sfile/sf_image.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/userlibandfileserver/fileserver/sfile/sf_image.h Mon Oct 19 15:55:17 2009 +0100 @@ -0,0 +1,347 @@ +// Copyright (c) 1998-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: +// f32\sfile\sf_image.h +// +// + +#ifndef __SF_IMAGE_H__ +#define __SF_IMAGE_H__ +#include +#include +#include +#include +#include "sf_deflate.h" + +_LIT(KLitLoader,"LOADER"); +//__DATA_CAGING__ +const TUint32 KCapabilityOffSet = 0x18; +const TUint32 KCapabilityLength = 0x04; +const TUint32 KCapabilityMask = 0x00000001; + +enum TPanic + { + ELoadLibraryWithoutDllLock=0, + }; + +class E32Image; +class RImageArray : public RPointerArray + { +public: + RImageArray(); + TInt Add(E32Image* aImage); + void Find(const TDesC8& aRootName, TInt& aFirst, TInt& aLast) const; + E32Image* Find(const TRomImageHeader* aRomImgHdr) const; + }; + +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; + }; + +class RLoaderMsg; + +// Information used to search for an image file +class RLdrReq : public TLdrInfo + { +public: + RLdrReq(); + void Close(); + void Panic(TInt aPanic); + TInt CheckForSubstDriveInName(); + TInt CheckForSubstDrivesInPath(); + TInt AddFileExtension(const TDesC8& aExt); + void Dump(const char* aTitle) const; + TInt CheckSecInfo(const SSecurityInfo& aCandidate) const; +public: + HBufC8* iFileName; + HBufC8* iCmd; + HBufC8* iPath; + const RLoaderMsg* iMsg; + SCapabilitySet iPlatSecCaps; + RThread iClientThread; + RProcess iClientProcess; + TFileNameInfo iFileNameInfo; + E32Image* iImporter; + }; + +class RLoaderFile : public RFile + { +public: + inline TBool IsOpen() + { return Session().Handle() && SubSessionHandle(); } + }; + +class TImageInfo + { +public: + TUint32 iUid[KMaxCheckedUid]; + TUint32 iModuleVersion; + SSecurityInfo iS; + TUint32 iAttr; + TUint16 iExportDirCount; + TUint8 iExportDescType; + TUint8 iNameLength; + enum TCacheStatusFlags + { + EHashChecked = 1, + }; + TUint8 iCacheStatus; + // 8-bit name follows (store base+ext only, not version) + // export description follows name + }; + +// Information returned by a search for an image file +class TFileCacheRecord; +class RImageInfo : public TImageInfo + { +public: + RImageInfo(); + RImageInfo& operator=(const TFileCacheRecord& aRecord); + void Close(); + void Accept(RImageInfo& aInfo); + inline TBool FileOpened() { return ((RLoaderFile*)&iFile)->IsOpen(); } +public: + RFile iFile; + E32ImageHeader* iHeader; // header if available + TUint8* iFileData; // file data if it's been loaded + TUint32 iFileSize; // size of loaded data + const TRomImageHeader* iRomImageHeader; // pointer to ROM image header for XIP + TUint16 iExportDescSize; + const TUint8* iExportDesc; // points into cache record so only valid during a single directory search + TUint8 iNeedHashCheck; // true if hash check was skipped and must be done at load time + }; + +// Image finder - looks at candidates for a load and remembers the best one +class RImageFinder + { +public: + RImageFinder(); + TInt Set(const RLdrReq& aReq); + void Close(); + TInt Search(); + TInt Search(const TDesC8* aPath, TInt aDrive); + TInt SearchSingleDir(); + TInt SearchExisting(const RImageArray& aArray); + TInt Try(RImageInfo& aInfo, const TDesC8& aRootName, const TDesC8& aDriveAndPath); + void RecordCorruptFile(); + void SetName(const TDesC8& aRootName, const TDesC8& aDriveAndPath); + void Dump(const char* aTitle, TInt aR); + void CompareHashL(RImageInfo& aInfo, const TDesC8& aDriveAndPath); +public: + TInt iNameMatches; // number of files for which name matches + TInt iUidFail; // number of files for which UIDs are incompatible + TInt iCapFail; // number of files for which capabilities/SID are incompatible + TInt iMajorVersionFail; // number of files with lower major version than requested + TInt iImportFail; // number of files which failed import check + TUint32 iCurrentVersion; // version of current best match + TPtrC8 iCurrentPath; // current search directory + TUint8 iCurrentDrive; // current search drive + TUint8 iFindExact; + TUint8 iNewValid; // a valid new image has been found + const RLdrReq* iReq; + E32Image* iExisting; // pointer to existing image if that is currently the best + RImageInfo iNew; // new image info if that is currently the best + TBuf8 iNewFileName; // full path name for new image file + TBuf8 iRootName; + }; + +extern RFs gTheLoaderFs; +extern TAny* gExeCodeSeg; +extern TUint32 gExeAttr; +extern TAny* gKernelCodeSeg; +extern TUint32 gKernelAttr; +extern TBool gExecutesInSupervisorMode; + +TInt GetModuleInfo(RLdrReq& aReq); +TInt GetInfoFromHeader(const RLoaderMsg& aMsg); +TInt CheckSystemBin(const TDesC& aThePath); +TInt LoadProcess(RLdrReq& aReq); +TInt LoadLibrary(RLdrReq& aReq); +TInt LoadDeviceDriver(RLdrReq& aReq, TInt aDeviceType); +TInt LoadLocale(RLdrReq& aReq, TLibraryFunction* aExportsList); +TInt CheckUids(const TUidType& aUids, const TUidType& aRequestedUids); +TInt OpenFile8(RFile& aFile, const TDesC8& aName); +TInt CheckSubstDrive(TDes8& aDest, const TDesC8& aSrc); +TInt CompareVersions(TUint32 aL, TUint32 aR); +TInt CheckRequiredImports(E32Image* aImporter, E32Image* aExporter, TInt aAction); +TInt CheckRequiredImports(E32Image* aImporter, const RImageInfo& aExporter, TInt aAction); +TInt CheckedCollapse(TDes8& aDest, const TDesC16& aSrc); + + +enum TVersionCompareResult + { + EVersion_MinorBigger=0, + EVersion_Exact, + EVersion_MajorBigger, + EVersion_MinorSmaller, + EVersion_MajorSmaller, + }; + +TInt DetailedCompareVersions(TUint32 aCandidate, TUint32 aRequest); +TInt DetailedCompareVersions(TUint32 aCandidate, TUint32 aRequest, TUint32 aCurrent, TBool aStrict); + +enum TVersionCompareAction + { + EAction_Skip=0, + EAction_CheckLastImport, + EAction_CheckImports, + EAction_Replace, + }; + + + +class E32Image : public TProcessCreateInfo + { +public: + E32Image(); + ~E32Image(); + void Reset(); + + TInt Construct(RImageFinder& aFinder); + void Construct(const TRomImageHeader& a); + TInt OpenFile(); + + TBool AlwaysLoaded(); + + TInt LoadProcess(const RLdrReq& aReq); + TInt LoadCodeSeg(const RLdrReq& aReq); + TInt DoLoadCodeSeg(const RLdrReq& aReq, RImageFinder& aFinder); + TInt DoLoadCodeSeg(const TRomImageHeader& aRomImgHdr); + TInt CheckAlreadyLoaded(); + TInt CheckRomXIPAlreadyLoaded(); + TInt ProcessFileName(); + void GetRomFileName(); + static TBool TraverseDirs(const TRomDir& aDir, const TRomImageHeader* aHdr, TDes8& aName); + + TInt LoadToRam(); + TInt LoadFile(); + TInt LoadFileNoCompress(); + TInt Read(TUint aPos,TUint8* aDest,TUint aSize,TBool aSvPerms=EFalse); + void LoadFileInflateL(); + void LoadFileBytePairUnpakL(); + TInt RelocateCode(); + TInt RelocateExports(); + TInt LoadAndRelocateData(); + TInt RelocateSection(E32RelocSection* aSection, TUint32 aLoadAddress); + static TUint8* WordCopy(TAny* aDestination, const TAny* aSource, TInt aNumberOfBytes); + static TUint8* MemCopy(TAny* aDestination, const TAny* aSource, TInt aNumberOfBytes); + TInt ReadImportData(); + + TInt ProcessImports(); + + TInt LoadDlls(RImageArray& aDllArray); + TInt GetCurrentImportList(const E32ImportBlock* aBlock); + static TInt FixupDlls(RImageArray& aDllArray); + TUint64* ExpandFixups(TInt aNumFixups); + TInt FinaliseDlls(RImageArray& aDllArray); + void CleanupDlls(RImageArray& aDllArray); + + TInt LastCurrentImport(); + void SortCurrentImportList(); + static TInt Order(const E32Image& aL, const E32Image& aR); + TInt ReadExportDirLoad(); + + // for demand paging... + TInt ShouldBeCodePaged(TBool& aPage); + TInt LoadCompressionData(); + TInt LoadCompressionDataNoCompress(); + void LoadCompressionDataBytePairUnpakL(); + TInt BuildCodeBlockMap(); + TInt AllocateRelocationData(E32RelocSection* aSection, TUint32 aAreaSize, TUint32 aLoadAddress, TUint32*& aProcessedBlock); + TInt BuildImportFixupTable(); +public: + const TRomImageHeader* iRomImageHeader; + E32ImageHeader* iHeader; + E32RelocSection* iCodeRelocSection; // address within iRestOfFileData + E32RelocSection* iDataRelocSection; // address within iRestOfFileData + TUint32* iImportData; + TUint8* iRestOfFileData; // buffer holding all file data after code section + TUint32 iRestOfFileSize; // size of data at iRestOfFileData + TUint32 iConversionOffset; + RFile iFile; + TUint8* iFileData; // file data if it's been loaded + TUint32 iFileSize; // size of loaded data + TUint32* iCopyOfExportDir; + TUint32 iExportDirLoad; + TUint32 iExportDirEntryDelta; // value to add to all values read from iExportDirLoad + E32Image* iMain; + TAny* iCloseCodeSeg; + TInt iCurrentImportCount; + TInt iNextImportPos; + TUint32* iCurrentImportList; + TUint8 iCurrentImportListSorted; + TUint8 iIsDll; + TUint8 iAlreadyLoaded; + TUint8 iPadding2; + TInt iFixupCount; // number of fixups in iFixups + TUint64* iFixups; // array of fixups to apply to demand paged code {addr,value} pairs + }; + + +inline TBool CheckUid(TUint32 aUid, TUint32 aRequestedUid) + { + return (aRequestedUid==0 || aRequestedUid==aUid); + } + + +#endif