imgtools/imgcheck/libimgutils/src/romreader.cpp
changeset 590 360bd6b35136
parent 0 044383f39525
--- a/imgtools/imgcheck/libimgutils/src/romreader.cpp	Wed Jun 16 16:51:40 2010 +0300
+++ b/imgtools/imgcheck/libimgutils/src/romreader.cpp	Wed Jun 23 16:56:47 2010 +0800
@@ -1,804 +1,725 @@
-/*
-* Copyright (c) 2007-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: 
-*
-*/
-
-
-/**
- @file
- @internalComponent
- @released
-*/
-
-#include "romreader.h"
-#include "romfsentry.h"
-#include "romimageheader.h"
-#include  <e32rom.h>
-#include  <e32ldr.h>
-#include  <iostream>
-#include  <algorithm>
-#include  <functional>
-
-void InflateUnCompress(unsigned char* source, int sourcesize, unsigned char* dest, int destsize);
-
-/** 
-Static variable to mark whether TRomLoaderHeader is present in the ROM image or not.
-
-@internalComponent
-@released
-*/
-bool RomReader::iNoRomLoaderHeader = false;
-
-/** 
-Constructor intializes the class pointer members and member variables.
-
-@internalComponent
-@released
-
-@param aFile - image file name
-@param aImageType - image type
-*/
-RomReader::RomReader(const char* aFile, EImageType aImgType) 
-: ImageReader(aFile), iImageHeader(0), iData(0), iImgType(aImgType)
-{
-	iRomImageRootDirEntry = new RomImageDirEntry("");
-}
-
-/** 
-Destructor deletes the class pointer members.
-
-@internalComponent
-@released
-*/
-RomReader::~RomReader()
-{
-	delete [] iData;
-	iRomImageRootDirEntry->Destroy();
-	iRomImageRootDirEntry = 0;
-	DELETE(iImageHeader);
-	iRootDirList = 0;
-	iExeVsRomFsEntryMap.clear();
-}
-
-/** 
-Function responsible to read the whole image and assign it to an member
-
-@internalComponent
-@released
-*/
-void RomReader::ReadImage()
-{
-	iInputStream.open(iImgFileName.c_str(), Ios::binary | Ios::in);
-	if(!iInputStream.is_open())
-	{
-		cout << "Error: " << "Can not open file: " << ImageName().c_str() << endl;
-		exit(EXIT_FAILURE);
-	}
-	iInputStream.seekg(0, Ios::end);
-	iImageSize = iInputStream.tellg();
-	iData = new unsigned char[iImageSize];
-	memset(iData, 0, iImageSize);
-	iInputStream.seekg(0, Ios::beg);
-	iInputStream.read((char*)iData, iImageSize);
-	iInputStream.close();
-}
-
-
-/** 
-Function responsible to return the compression type
-Can handle ROM and Extension ROM images.
-
-@internalComponent
-@released
-
-@return - returns the compression type
-*/
-const unsigned long int RomReader::ImageCompressionType() const
-{
-	if(iImageHeader->iRomHdr)
-		return iImageHeader->iRomHdr->iCompressionType;
-	else
-		return iImageHeader->iExtRomHdr->iCompressionType;
-}
-
-
-/** 
-Function responsible to return the Rom header pointer address
-Can handle ROM and Extension ROM images.
-
-@internalComponent
-@released
-
-@return - returns the Rom header pointer address
-*/
-const char* RomReader::RomHdrPtr() const
-{
-	if(iImageHeader->iRomHdr)
-		return (char*)(iImageHeader->iRomHdr);
-	else
-		return (char*)(iImageHeader->iExtRomHdr);
-}
-
-
-/** 
-Function responsible to return the Rom base address in the image
-Can handle ROM and Extension ROM images.
-
-@internalComponent
-@released
-
-@return - returns the Rom base address
-*/
-const unsigned long int RomReader::RomBase() const
-{
-	if(iImageHeader->iRomHdr)
-		return iImageHeader->iRomHdr->iRomBase ;
-	else
-		return iImageHeader->iExtRomHdr->iRomBase;
-}
-
-
-/** 
-Function responsible to return the Rom root directory list
-Can handle ROM and Extension ROM images.
-
-@internalComponent
-@released
-
-@return - returns the Rom root directory list
-*/
-const unsigned long int RomReader::RootDirList() const
-{
-	if(iImageHeader->iRomHdr)
-		return iImageHeader->iRomHdr->iRomRootDirectoryList;
-	else
-		return iImageHeader->iExtRomHdr->iRomRootDirectoryList;
-}
-
-
-/** 
-Function responsible to return the Rom header size
-Can handle ROM and Extension ROM images.
-
-@internalComponent
-@released
-
-@return - returns the Rom header size
-*/
-const unsigned int RomReader::HdrSize() const
-{
-	if(iImageHeader->iRomHdr) 
-		return (sizeof(TRomLoaderHeader) + sizeof(TRomHeader));
-	else
-		return sizeof(TExtensionRomHeader);
-}
-
-/** 
-Function responsible to return the Rom image size
-Can handle ROM and Extension ROM images.
-
-@internalComponent
-@released
-
-@return - returns the Rom Image size
-*/
-const unsigned int RomReader::ImgSize() const
-{
-	if(ImageCompressionType() == KUidCompressionDeflate) 
-		return iImageHeader->iRomHdr->iUncompressedSize;
-	else
-		return iImageSize;
-}
-
-/** 
-Function responsible to process the ROM image
-1. Read the header.
-2. Identify the compression type.
-3. If the image is compressed then uncompress and update the image content buffer iData.
-4. Build the directory tree by reading all the Rood and subdirectory elements.
-
-@internalComponent
-@released
-*/
-void RomReader::ProcessImage()
-{
-	if(iImageSize > sizeof(TRomLoaderHeader) || iImageSize > sizeof(TExtensionRomHeader))
-	{
-	iImageHeader = new RomImageHeader((char*)iData, iImgType, iNoRomLoaderHeader);
-	
-	if(ImageCompressionType() == KUidCompressionDeflate)
-	{
-		unsigned int aDataStart = HdrSize();
-		unsigned char* aData = new unsigned char[iImageHeader->iRomHdr->iUncompressedSize + aDataStart];
-		InflateUnCompress((iData + aDataStart), iImageHeader->iRomHdr->iCompressedSize, (aData + aDataStart), iImageHeader->iRomHdr->iUncompressedSize);
-		memcpy(aData, iData, aDataStart);
-		delete [] iData;
-
-		iData = aData;
-		//update the header fields...
-		if(iImgType == ERomImage)
-		{
-			iImageHeader->iLoaderHdr = (TRomLoaderHeader*)iData;
-			iImageHeader->iRomHdr = (TRomHeader*)(iData + sizeof(TRomLoaderHeader));
-		}
-	}
-	else if(ImageCompressionType() != 0)
-	{
-		std::cout << "Error: Invalid image: " << ImageName() << std::endl;
-		exit(EXIT_FAILURE);
-	}
-	else if (iImageHeader->iRomHdr && iImageHeader->iRomHdr->iRomPageIndex) // paged ROM
-	{
-		const int KPageSize = 0x1000;
-		TRomHeader *pRomHdr = iImageHeader->iRomHdr;
-		unsigned int headerSize = HdrSize();
-
-        TInt numPages = (pRomHdr->iPageableRomStart + pRomHdr->iPageableRomSize+KPageSize-1)/KPageSize;
-		unsigned char* aData = new unsigned char[pRomHdr->iUncompressedSize + headerSize];
-		unsigned char* dest = aData + sizeof(TRomLoaderHeader) + pRomHdr->iPageableRomStart;
-		SRomPageInfo* pi = (SRomPageInfo*)((unsigned char*)pRomHdr + pRomHdr->iRomPageIndex);
-                CBytePair bpe(EFalse);
-
-		for(int i = 0; i < numPages; i++, pi++)
-			{
-			if (pi->iPagingAttributes != SRomPageInfo::EPageable) // skip uncompressed part at the beginning of ROM image
-				continue;
-			
-			switch(pi->iCompressionType)
-				{
-				case SRomPageInfo::ENoCompression:
-					memcpy(dest, (unsigned char*)pRomHdr + pi->iDataStart, pi->iDataSize);
-					dest += pi->iDataSize;
-					break;
-
-				case SRomPageInfo::EBytePair:
-					{
-					unsigned char* srcNext = 0;
-					int unpacked = bpe.Decompress(dest, KPageSize, (unsigned char*)pRomHdr + pi->iDataStart, pi->iDataSize, srcNext);
-					if (unpacked  <  0)
-						{
-						delete [] aData;
-						std::cout  << "Error:" <<  "Corrupted BytePair compressed ROM image"  <<  std::endl;
-						exit(EXIT_FAILURE);
-						}
-
-					dest += unpacked;
-					break;
-					}
-
-				default:
-					delete [] aData;
-					std::cout  << "Error:" << "Undefined compression type"  <<  std::endl;
-					exit(EXIT_FAILURE);
-				}
-			}
-	
-		memcpy(aData, iData, sizeof(TRomLoaderHeader) + pRomHdr->iPageableRomStart);
-		delete [] iData;
-
-		iData = aData;
-
-		//update the header fields...
-		if(iImgType == ERomImage)
-		{
-			iImageHeader->iLoaderHdr = (TRomLoaderHeader*)iData;
-			iImageHeader->iRomHdr = (TRomHeader*)(iData + sizeof(TRomLoaderHeader));
-		}
-	}
-
-	unsigned long int aOff = RootDirList() - RomBase();
-	iRootDirList = (TRomRootDirectoryList*)(RomHdrPtr() + aOff);
-	int aDirs = 0;
-	TRomDir	*aRomDir;
-	while(aDirs  <  iRootDirList->iNumRootDirs)
-	{
-		aOff = iRootDirList->iRootDir[aDirs].iAddressLin - RomBase();
-		aRomDir = (TRomDir*)(RomHdrPtr() + aOff);
-
-		BuildDir(aRomDir, iRomImageRootDirEntry);
-		aDirs++;
-	}
-	}
-	else
-	{
-		std::cout << "Error: " << "Invalid image: " << iImgFileName.c_str() << std::endl;
-		exit(EXIT_FAILURE);
-	}
-}
-
-
-/** 
-Function responsible to Get Rom directory table
-
-@internalComponent
-@released
-
-@param aBase - base poniter
-@param aCount - No of entries in the table
-@param aRomDir - Current Rom directory.
-*/
-void RomReader::GetRomDirTbl(short int** aBase, short int& aCount, TRomDir *aRomDir)
-{
-	short int *aSubDirCnt = 0;
-	short int *aFileCnt = 0;
-
-	//Sub directories in this directories
-	aSubDirCnt = (short int*)((char*)aRomDir + aRomDir->iSize + sizeof(aRomDir->iSize));
-	//Files within this directory
-	aFileCnt = aSubDirCnt+1;
-	aCount = (*aFileCnt + *aSubDirCnt);
-	*aBase = aFileCnt+1;
-}
-
-
-/** 
-Function responsible to Build directory tree.
-
-@internalComponent
-@released
-
-@param aDir - directory
-@param aPaFSEntry - Parent RomImageFSEntry
-*/
-void RomReader::BuildDir(TRomDir* aDir, RomImageFSEntry* aPaFSEntry)
-{
-
-	short int			*aBase, aCount;
-
-	GetRomDirTbl(&aBase, aCount, aDir);
-	/**Images built using option -no-sorted-romfs are compatible with Symbian OS v6.1.
-	But imgcheck tool supports only Symbian OS v9.1 to Future versions.
-	*/
-	if(aCount <= 0)
-	{
-		cerr << "Error: Invalid Image " << iImgFileName.c_str() << endl;
-		exit(EXIT_FAILURE);
-	}
-	BuildDir(aBase, aCount, aDir, aPaFSEntry);
-}
-
-
-/** 
-Function responsible to add the read directory or file into tree.
-
-@internalComponent
-@released
-
-@param aOffsetTbl - Table offset
-@param aOffsetTblCount - No of entries in the table
-@param aPaRomDir - Parent TRomDir
-@param aPaFSEntry - Parent RomImageFSEntry
-*/
-void RomReader::BuildDir(short int *aOffsetTbl, short int aOffsetTblCount, 
-							   TRomDir *aPaRomDir, RomImageFSEntry* aPaFSEntry)
-{
-	RomImageFSEntry *aNewFSEntry;
-	TRomDir	*aNewDir;
-	TRomEntry *aRomEntry;
-	unsigned long int aOffsetFromBase;
-	unsigned int aOffset;
-	String	aName;
-	char	*aPtr;
-
-	while(aOffsetTblCount--)
-	{
-		aOffsetFromBase = *aOffsetTbl;
-		aOffsetFromBase  <<= 2;
-		aRomEntry = (TRomEntry*)((char*)aPaRomDir + sizeof(int) + aOffsetFromBase);
-		aPtr = (char*)aRomEntry->iName;
-		Name(aName, aPtr, aRomEntry->iNameLength);
-
-		if(aRomEntry->iAtt & 0x10)//KEntryAttDir
-		{
-			aNewFSEntry = new RomImageDirEntry((char*)aName.data());
-			AddChild(aPaFSEntry, aNewFSEntry, KNull);
-
-			aOffset = aRomEntry->iAddressLin - RomBase();
-			aNewDir = (TRomDir*)(RomHdrPtr() + aOffset);
-			BuildDir(aNewDir, aNewFSEntry);
-		}
-		else
-		{
-			aNewFSEntry = new RomImageFileEntry((char*)aName.data());
-			AddChild(aPaFSEntry, aNewFSEntry, aRomEntry);
-		}
-		aOffsetTbl++;
-	}
-}
-
-
-/** 
-Function responsible to add current entry as child to aPa.
-
-@internalComponent
-@released
-
-@param aPa - Parent RomImageFSEntry.
-@param aChild - child RomImageFSEntry.
-@param aRomEntry - Current entry.
-*/
-void RomReader::AddChild(RomImageFSEntry *aPa, RomImageFSEntry *aChild, TRomEntry* aRomEntry)
-{
-	if(!aPa->iChildren)
-	{
-		aPa->iChildren = aChild;
-	}
-	else
-	{
-		RomImageFSEntry *aLast = aPa->iChildren;
-		while(aLast->iSibling)
-			aLast = aLast->iSibling;
-
-		aLast->iSibling = aChild;
-	}
-
-	if(!aChild->IsDirectory())
-	{
-		TRomImageHeader* aImgHdr;
-		unsigned long int aOff;
-		RomImageFileEntry* entry = (RomImageFileEntry*)aChild;
-		entry->iTRomEntryPtr = aRomEntry;
-		if(aRomEntry->iAddressLin > RomBase())
-		{
-			aOff = aRomEntry->iAddressLin - RomBase();
-			aImgHdr = (TRomImageHeader*)(RomHdrPtr() + aOff);
-			entry->ImagePtr.iRomFileEntry = aImgHdr;
-			unsigned char aUid1[4];
-            memcpy(aUid1, &((RomImageFileEntry*)aChild)->ImagePtr.iRomFileEntry->iUid1, 4);
-
-			//Skip the E32 executables included as a DATA files in ROM image.
-			if(ReaderUtil::IsExecutable(aUid1) && aImgHdr->iCodeAddress > RomBase() && 
-			aImgHdr->iCodeAddress < (RomBase() + ImgSize()))
-			{
-				iExeAvailable = true;
-				entry->iExecutable = true;
-                iExeVsRomFsEntryMap.insert(std::make_pair(entry->iName, aChild));
-			}
-			else
-			{
-				entry->iExecutable = false;
-				entry->ImagePtr.iDataFileAddr = aRomEntry->iAddressLin;
-			}
-		}
-		else
-		{
-			entry->ImagePtr.iRomFileEntry = KNull;
-		}
-	}
-	if(aPa != iRomImageRootDirEntry)
-	{
-		aChild->iPath = aPa->iPath;
-		aChild->iPath += KDirSeperaor;
-		aChild->iPath += aPa->iName.data();
-	}
-}
-
-
-/** 
-Function responsible to return the complete name by taking its unicode and length.
-
-@internalComponent
-@released
-
-@param aName - Name to be returned
-@param aUnicodeName - Unicode name
-@param aLen - Length of the name
-*/
-void RomReader::Name(String& aName, const char * aUnicodeName, const int aLen)
-{
-	int aPos = 0;
-	int uncodeLen = aLen  <<  1;
-	aName = ("");
-	while(aPos  <  uncodeLen)
-	{
-		if(aUnicodeName[aPos])
-			aName += aUnicodeName[aPos];
-		aPos++;
-	}
-}
-
-/** 
-Function responsible to prepare Executable List by traversing through iExeVsRomFsEntryMap
-
-@internalComponent
-@released
-*/
-void RomReader::PrepareExecutableList()
-{
-    ExeVsRomFsEntryMap::iterator exeBegin = iExeVsRomFsEntryMap.begin();
-    ExeVsRomFsEntryMap::iterator exeEnd = iExeVsRomFsEntryMap.end();
-    while(exeBegin != exeEnd)
-    {
-        String str = exeBegin->first;
-        iExecutableList.push_back(ReaderUtil::ToLower(str));
-        ++exeBegin;
-    }
-}
-
-/** 
-Function responsible to create address vs executable map.
-Later this address is used as a key to get executable name
-
-@internalComponent
-@released
-*/
-void RomReader::PrepareAddVsExeMap()
-{
-    ExeVsRomFsEntryMap::iterator exeBegin = iExeVsRomFsEntryMap.begin();
-    ExeVsRomFsEntryMap::iterator exeEnd = iExeVsRomFsEntryMap.end();
-    while(exeBegin != exeEnd)
-    {
-   		UintVsString sizeVsExeName;
-		unsigned int address;
-		RomImageFileEntry* fileEntry = (RomImageFileEntry*)exeBegin->second;
-		TRomImageHeader	*aRomImgEntry = fileEntry->ImagePtr.iRomFileEntry;
-		if(aRomImgEntry != KNull)
-		{
-			address = aRomImgEntry->iCodeAddress;
-			sizeVsExeName[aRomImgEntry->iCodeSize] = ReaderUtil::ToLower(exeBegin->second->iName);
-		}
-		else
-		{
-			address = fileEntry->iTRomEntryPtr->iAddressLin;
-			sizeVsExeName[fileEntry->iTRomEntryPtr->iSize] = ReaderUtil::ToLower(exeBegin->second->iName);
-		}
-		iAddVsExeMap.insert(std::make_pair(address, sizeVsExeName));
-		iImageAddress.push_back(address);
-        ++exeBegin;
-    }
-	std::sort(iImageAddress.begin(), iImageAddress.end(), std::greater < unsigned int>());
-}
-
-/** 
-Function responsible to say whether it is an ROM image or not.
-
-@internalComponent
-@released
-
-@param aWord - which has the identifier string
-@return - returns true or false.
-*/
-bool RomReader::IsRomImage(const String& aWord)
-{
-	//Epoc Identifier should start at 0th location, Rom Identifier should start at 8th location
-	if((aWord.find(KEpocIdentifier) == 0) && (aWord.find(KRomImageIdentifier) == 8))
-	{
-		return true;
-	}
-	else
-	{
-		iNoRomLoaderHeader = true;
-		//TRomLoaderHeader is not present
-		TRomHeader *romHdr = (TRomHeader*)aWord.c_str();
-	    /**If the ROM image is built without TRomLoaderHeaderi, ROM specific identifier will not be available
-		hence these two header variables used.*/
-		if((romHdr->iRomBase >= KRomBase) && (romHdr->iRomRootDirectoryList > KRomBase) 
-			&& (romHdr->iRomBase < KRomBaseMaxLimit) && (romHdr->iRomRootDirectoryList < KRomBaseMaxLimit))
-		{
-			return true;
-		}
-	}
-	return false;
-}
-
-/** 
-Function responsible to say whether it is an ROM extension image or not.
-
-@internalComponent
-@released
-
-@param aWord - which has the identifier string
-@return - retruns true or false.
-*/
-bool RomReader::IsRomExtImage(const String& aWord)
-{
-    if(aWord.at(0) == KNull && aWord.at(1) == KNull &&
-	aWord.at(2) == KNull && aWord.at(3) == KNull &&
-    aWord.at(4) == KNull && aWord.at(5) == KNull)
-    {
-	    //Since no specific identifier is present in the ROM Extension image these two header variables used.
-	    TExtensionRomHeader* romHdr = (TExtensionRomHeader*)aWord.c_str();
-	    if((romHdr->iRomBase > KRomBase) && (romHdr->iRomRootDirectoryList > KRomBase)
-			&& (romHdr->iRomBase < KRomBaseMaxLimit) && (romHdr->iRomRootDirectoryList < KRomBaseMaxLimit))
-	    {
-		    return true;
-	    }
-    }
-	return false;
-}
-
-/** 
-Function responsible to gather dependencies for all the executables.
-
-@internalComponent
-@released
-
-@return iImageVsDepList - returns all executable's dependencies
-*/
-ExeNamesVsDepListMap& RomReader::GatherDependencies()
-{
-	PrepareAddVsExeMap();
-	ExeVsRomFsEntryMap::iterator exeBegin = iExeVsRomFsEntryMap.begin();
-    ExeVsRomFsEntryMap::iterator exeEnd = iExeVsRomFsEntryMap.end();
-    while(exeBegin != exeEnd)
-    {
-		if(((RomImageFileEntry*)exeBegin->second)->iTRomEntryPtr->iAddressLin > RomBase())
-		{
-			StringList importExecutableNameList;
-			CollectImportExecutableNames(exeBegin->second, importExecutableNameList);
-			iImageVsDepList.insert(std::make_pair(exeBegin->second->iName, importExecutableNameList));
-		}
-        ++exeBegin;
-	}
-	return iImageVsDepList;
-}
-
-/** 
-Function responsible to read the dependency names.
-
-@internalComponent
-@released
-
-@param aRomReader - ROM reader pointer
-@param aEntry - Current RomImageFSEntry
-@param aImportExecutableNameList - Executable list.(output)
-*/
-void RomReader::CollectImportExecutableNames(const RomImageFSEntry* aEntry, StringList& aImportExecutableNameList)
-{
-	unsigned int sectionOffset = 0;
-	unsigned int codeSize = 0;
-	unsigned int dependencyAddress = 0;
-	unsigned int* codeSection = 0;
-	bool patternFound = false;
-
-	RomImageFileEntry* fileEntry = (RomImageFileEntry*)aEntry;
-	TRomImageHeader	*romImgEntry = fileEntry->ImagePtr.iRomFileEntry;
-	sectionOffset = romImgEntry->iCodeAddress - RomBase();
-	codeSection = (unsigned int*)((char*)RomHdrPtr() + sectionOffset);
-	codeSize = romImgEntry->iCodeSize;
-
-	UintVsString* CodeSizeVsExeNameAddress = 0;
-	RomAddrVsExeName::iterator addVsSizeExeName;
-	UintVsString::iterator CodeSizeVsExeName;
-	// Checking for LDR Instruction in PLT section(Inside Code section)
-	// to get the import address.
-	while(codeSize > 0)
-	{
-		if(*codeSection++ == KLdrOpcode)
-		{
-			patternFound = true;
-			dependencyAddress = *codeSection++;
-			addVsSizeExeName = iAddVsExeMap.find(CodeSectionAddress(dependencyAddress));
-			CodeSizeVsExeNameAddress = &addVsSizeExeName->second;
-			CodeSizeVsExeName = CodeSizeVsExeNameAddress->begin();
-			if(!(dependencyAddress < (addVsSizeExeName->first + CodeSizeVsExeName->first)))
-			{
-				aImportExecutableNameList.push_back(KUnknownDependency);
-			}
-			else
-			{
-				aImportExecutableNameList.push_back(CodeSizeVsExeName->second);
-			}
-		}
-		else
-		{
-			if(patternFound == true)
-			{
-				break;
-			}
-		}
-        --codeSize;
-	} 
-	aImportExecutableNameList.sort();
-	aImportExecutableNameList.unique();
-}
-typedef std::iterator_traits<VectorList::iterator>::difference_type Distance;
-static VectorList::iterator get_lower_bound(VectorList aVec, const unsigned int& aVal){
-	VectorList::iterator first = aVec.begin();
-	VectorList::iterator last = aVec.end();
-	Distance len = std::distance(first, last);
-  Distance half;
-  VectorList::iterator middle;
-
-  while (len > 0) {
-    half = len >> 1;
-    middle = first;
-    std::advance(middle, half);    
-    if (*middle > aVal) {      
-      first = middle;
-      ++first;
-      len = len - half - 1;
-    }
-    else
-     len = half;
-  }
-  return first;
-}
-
- 
-/** 
-Function responsible to read the dependency address from the Exe Map container.
-
-@internalComponent
-@released
-
-@param aImageAddress - Dependency address (function address)
-@returns - e32image start address(code section).
-*/
-unsigned int RomReader::CodeSectionAddress(unsigned int& aImageAddress)
-{
-	/*
-	This invocation leads to a warning, due to the stlport implememtation
-	VectorList::iterator lowerAddress = std::lower_bound(iImageAddress.begin(), 
-										iImageAddress.end(), aImageAddress, std::greater <unsigned int>());
-	*/
-										
-	VectorList::iterator lowerAddress = get_lower_bound(iImageAddress,aImageAddress);
-	return *lowerAddress;
-}
-
-/** 
-Function responsible to fill iExeVsIdData and iSidVsExeName containers.
-
-@internalComponent
-@released
-
-@param iRomImageRootDirEntry - Root directory entry
-@param iExeVsIdData - Container
-@param iSidVsExeName - Container
-*/
-void RomReader::PrepareExeVsIdMap()
-{
-    ExeVsRomFsEntryMap::iterator exeBegin = iExeVsRomFsEntryMap.begin();
-    ExeVsRomFsEntryMap::iterator exeEnd = iExeVsRomFsEntryMap.end();
-    IdData* id = KNull;
-	RomImageFileEntry* entry = KNull;
-	if(iExeVsIdData.size() == 0) //Is not already prepared
-	{
-		while(exeBegin != exeEnd)
-		{
-			id = new IdData;
-			entry = (RomImageFileEntry*)exeBegin->second;
-			id->iUid = entry->ImagePtr.iRomFileEntry->iUid1;
-			id->iDbgFlag = (entry->ImagePtr.iRomFileEntry->iFlags & KImageDebuggable) ? true : false;
-			if(entry->iTRomEntryPtr->iAddressLin > RomBase())
-			{
-				String& exeName = exeBegin->second->iName;
-				//This header contains the SID and VID, so create the instance of IdData.
-				TRomImageHeader	*aRomImgEntry = entry->ImagePtr.iRomFileEntry;
-				
-				id->iSid = aRomImgEntry->iS.iSecureId;
-				id->iVid = aRomImgEntry->iS.iVendorId;
-				id->iFileOffset = aRomImgEntry->iEntryPoint;
-				iExeVsIdData[exeName] = id;
-			}
-			++exeBegin;
-		}
-	}
-	id = KNull;
-}
-
-/** 
-Function responsible to return the Executable versus IdData container. 
-
-@internalComponent
-@released
-
-@return - returns iExeVsIdData
-*/
-const ExeVsIdDataMap& RomReader::GetExeVsIdMap() const
-{
-    return iExeVsIdData;
-}
+/*
+* Copyright (c) 2007-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: 
+*
+*/
+
+
+/**
+@file
+@internalComponent
+@released
+*/
+
+#include "romreader.h"
+#include "romfsentry.h"
+#include "romimageheader.h"
+#include "utf16string.h"
+#include  <e32rom.h>
+#include  <e32ldr.h>
+#include  <iostream>
+#include  <algorithm>
+#include  <functional>
+
+void InflateUnCompress(unsigned char* source, int sourcesize, unsigned char* dest, int destsize);
+
+/** 
+Static variable to mark whether TRomLoaderHeader is present in the ROM image or not.
+
+@internalComponent
+@released
+*/
+bool RomReader::iNoRomLoaderHeader = false;
+
+/** 
+Constructor intializes the class pointer members and member variables.
+
+@internalComponent
+@released
+
+@param aFile - image file name
+@param aImageType - image type
+*/
+RomReader::RomReader(const char* aFile, EImageType aImgType) 
+: ImageReader(aFile), iImageHeader(0), iData(0), iImgType(aImgType) {
+	iRomImageRootDirEntry = new RomImageDirEntry("");
+}
+
+/** 
+Destructor deletes the class pointer members.
+
+@internalComponent
+@released
+*/
+RomReader::~RomReader() {
+	if(iData){
+		delete [] iData;
+		iData = 0 ;
+	}
+	iRomImageRootDirEntry->Destroy();
+	iRomImageRootDirEntry = 0;
+	if(iImageHeader){
+		delete iImageHeader;
+		iImageHeader = 0;
+	}
+	iRootDirList = 0;
+	for(RomAddrVsExeName::iterator it = iAddVsExeMap.begin(); it != iAddVsExeMap.end() ; it++){
+		delete (*it).second;
+	}
+	iAddVsExeMap.clear();
+	iExeVsRomFsEntryMap.clear();
+}
+
+/** 
+Function responsible to read the whole image and assign it to an member
+
+@internalComponent
+@released
+*/
+void RomReader::ReadImage() {
+	iInputStream.open(iImgFileName.c_str(), ios_base::binary | ios_base::in);
+	if(!iInputStream.is_open()) {
+		cout << "Error: " << "Can not open file: " << ImageName() << endl;
+		exit(EXIT_FAILURE);
+	}
+	iInputStream.seekg(0, ios_base::end);
+	iImageSize = iInputStream.tellg();
+	iData = new unsigned char[iImageSize];
+	memset(iData, 0, iImageSize);
+	iInputStream.seekg(0, ios_base::beg);
+	iInputStream.read((char*)iData, iImageSize);
+	iInputStream.close();
+}
+
+
+/** 
+Function responsible to return the compression type
+Can handle ROM and Extension ROM images.
+
+@internalComponent
+@released
+
+@return - returns the compression type
+*/
+const unsigned long int RomReader::ImageCompressionType() const {
+	if(iImageHeader->iRomHdr)
+		return iImageHeader->iRomHdr->iCompressionType;
+	else
+		return iImageHeader->iExtRomHdr->iCompressionType;
+}
+
+
+/** 
+Function responsible to return the Rom header pointer address
+Can handle ROM and Extension ROM images.
+
+@internalComponent
+@released
+
+@return - returns the Rom header pointer address
+*/
+const char* RomReader::RomHdrPtr() const {
+	if(iImageHeader->iRomHdr)
+		return (char*)(iImageHeader->iRomHdr);
+	else
+		return (char*)(iImageHeader->iExtRomHdr);
+}
+
+
+/** 
+Function responsible to return the Rom base address in the image
+Can handle ROM and Extension ROM images.
+
+@internalComponent
+@released
+
+@return - returns the Rom base address
+*/
+const unsigned long int RomReader::RomBase() const {
+	if(iImageHeader->iRomHdr)
+		return iImageHeader->iRomHdr->iRomBase ;
+	else
+		return iImageHeader->iExtRomHdr->iRomBase;
+}
+
+
+/** 
+Function responsible to return the Rom root directory list
+Can handle ROM and Extension ROM images.
+
+@internalComponent
+@released
+
+@return - returns the Rom root directory list
+*/
+const unsigned long int RomReader::RootDirList() const {
+	if(iImageHeader->iRomHdr)
+		return iImageHeader->iRomHdr->iRomRootDirectoryList;
+	else
+		return iImageHeader->iExtRomHdr->iRomRootDirectoryList;
+}
+
+
+/** 
+Function responsible to return the Rom header size
+Can handle ROM and Extension ROM images.
+
+@internalComponent
+@released
+
+@return - returns the Rom header size
+*/
+const unsigned int RomReader::HdrSize() const {
+	if(iImageHeader->iRomHdr) 
+		return (sizeof(TRomLoaderHeader) + sizeof(TRomHeader));
+	else
+		return sizeof(TExtensionRomHeader);
+}
+
+/** 
+Function responsible to return the Rom image size
+Can handle ROM and Extension ROM images.
+
+@internalComponent
+@released
+
+@return - returns the Rom Image size
+*/
+const unsigned int RomReader::ImgSize() const {
+	if(ImageCompressionType() == KUidCompressionDeflate) 
+		return iImageHeader->iRomHdr->iUncompressedSize;
+	else
+		return iImageSize;
+}
+
+/** 
+Function responsible to process the ROM image
+1. Read the header.
+2. Identify the compression type.
+3. If the image is compressed then uncompress and update the image content buffer iData.
+4. Build the directory tree by reading all the Rood and subdirectory elements.
+
+@internalComponent
+@released
+*/
+void RomReader::ProcessImage() {
+	if(iImageSize > sizeof(TRomLoaderHeader) || iImageSize > sizeof(TExtensionRomHeader)) {
+		iImageHeader = new RomImageHeader(reinterpret_cast<char*>(iData), iImgType, iNoRomLoaderHeader);
+
+		if(ImageCompressionType() == KUidCompressionDeflate) {
+			unsigned int aDataStart = HdrSize();
+			unsigned char* aData = new unsigned char[iImageHeader->iRomHdr->iUncompressedSize + aDataStart];
+			InflateUnCompress((iData + aDataStart), iImageHeader->iRomHdr->iCompressedSize, (aData + aDataStart), iImageHeader->iRomHdr->iUncompressedSize);
+			memcpy(aData, iData, aDataStart);
+			delete [] iData;
+
+			iData = aData;
+			//update the header fields...
+			if(iImgType == ERomImage) {
+				iImageHeader->iLoaderHdr = (TRomLoaderHeader*)iData;
+				iImageHeader->iRomHdr = (TRomHeader*)(iData + sizeof(TRomLoaderHeader));
+			}
+		}
+		else if(ImageCompressionType() != 0) {
+			cout << "Error: Invalid image: " << ImageName() << endl;
+			exit(EXIT_FAILURE);
+		}
+		else if (iImageHeader->iRomHdr && iImageHeader->iRomHdr->iRomPageIndex)  { // paged ROM
+			const int KPageSize = 0x1000;
+			TRomHeader *pRomHdr = iImageHeader->iRomHdr;
+			unsigned int headerSize = HdrSize();
+
+			TInt numPages = (pRomHdr->iPageableRomStart + pRomHdr->iPageableRomSize+KPageSize-1)/KPageSize;
+			unsigned char* aData = new unsigned char[pRomHdr->iUncompressedSize + headerSize];
+			unsigned char* dest = aData + sizeof(TRomLoaderHeader) + pRomHdr->iPageableRomStart;
+			SRomPageInfo* pi = (SRomPageInfo*)((unsigned char*)pRomHdr + pRomHdr->iRomPageIndex);
+			CBytePair bpe;
+
+			for(int i = 0; i < numPages; i++, pi++) {
+				if (pi->iPagingAttributes != SRomPageInfo::EPageable) // skip uncompressed part at the beginning of ROM image
+					continue;
+
+				switch(pi->iCompressionType) {
+				case SRomPageInfo::ENoCompression:
+					memcpy(dest, (unsigned char*)pRomHdr + pi->iDataStart, pi->iDataSize);
+					dest += pi->iDataSize;
+					break;
+
+				case SRomPageInfo::EBytePair: {
+					unsigned char* srcNext = 0;
+					int unpacked = bpe.Decompress(dest, KPageSize, (unsigned char*)pRomHdr + pi->iDataStart, pi->iDataSize, srcNext);
+					if (unpacked  <  0) {
+						delete [] aData;
+						cout  << "Error:" <<  "Corrupted BytePair compressed ROM image"  <<  endl;
+						exit(EXIT_FAILURE);
+					}
+
+					dest += unpacked;
+					break;
+											  }
+
+				default:
+					delete [] aData;
+					cout  << "Error:" << "Undefined compression type"  <<  endl;
+					exit(EXIT_FAILURE);
+				}
+			}
+
+			memcpy(aData, iData, sizeof(TRomLoaderHeader) + pRomHdr->iPageableRomStart);
+			delete [] iData;
+
+			iData = aData;
+
+			//update the header fields...
+			if(iImgType == ERomImage) {
+				iImageHeader->iLoaderHdr = (TRomLoaderHeader*)iData;
+				iImageHeader->iRomHdr = (TRomHeader*)(iData + sizeof(TRomLoaderHeader));
+			}
+		}
+
+		unsigned long int aOff = RootDirList() - RomBase();
+		iRootDirList = (TRomRootDirectoryList*)(RomHdrPtr() + aOff);
+		int aDirs = 0;
+		TRomDir	*aRomDir;
+		while(aDirs  <  iRootDirList->iNumRootDirs) {
+			aOff = iRootDirList->iRootDir[aDirs].iAddressLin - RomBase();
+			aRomDir = (TRomDir*)(RomHdrPtr() + aOff);
+
+			BuildDir(aRomDir, iRomImageRootDirEntry);
+			aDirs++;
+		}
+	}
+	else {
+		cout << "Error: " << "Invalid image: " << iImgFileName.c_str() << endl;
+		exit(EXIT_FAILURE);
+	}
+}
+
+
+/** 
+Function responsible to Get Rom directory table
+
+@internalComponent
+@released
+
+@param aBase - base poniter
+@param aCount - No of entries in the table
+@param aRomDir - Current Rom directory.
+*/
+void RomReader::GetRomDirTbl(short int** aBase, short int& aCount, TRomDir *aRomDir) {
+	short int *aSubDirCnt = 0;
+	short int *aFileCnt = 0;
+
+	//Sub directories in this directories
+	aSubDirCnt = (short int*)((char*)aRomDir + aRomDir->iSize + sizeof(aRomDir->iSize));
+	//Files within this directory
+	aFileCnt = aSubDirCnt+1;
+	aCount = (*aFileCnt + *aSubDirCnt);
+	*aBase = aFileCnt+1;
+}
+
+
+/** 
+Function responsible to Build directory tree.
+
+@internalComponent
+@released
+
+@param aDir - directory
+@param aPaFSEntry - Parent RomImageFSEntry
+*/
+void RomReader::BuildDir(TRomDir* aDir, RomImageFSEntry* aPaFSEntry) {
+
+	short int			*aBase, aCount;
+
+	GetRomDirTbl(&aBase, aCount, aDir);
+	/**Images built using option -no-sorted-romfs are compatible with Symbian OS v6.1.
+	But imgcheck tool supports only Symbian OS v9.1 to Future versions.
+	*/
+	if(aCount <= 0) {
+		cerr << "Error: Invalid Image " << iImgFileName.c_str() << endl;
+		exit(EXIT_FAILURE);
+	}
+	BuildDir(aBase, aCount, aDir, aPaFSEntry);
+}
+
+
+/** 
+Function responsible to add the read directory or file into tree.
+
+@internalComponent
+@released
+
+@param aOffsetTbl - Table offset
+@param aOffsetTblCount - No of entries in the table
+@param aPaRomDir - Parent TRomDir
+@param aPaFSEntry - Parent RomImageFSEntry
+*/
+void RomReader::BuildDir(short int *aOffsetTbl, short int aOffsetTblCount, 
+						 TRomDir *aPaRomDir, RomImageFSEntry* aPaFSEntry) {
+							 RomImageFSEntry *aNewFSEntry;
+							 TRomDir	*aNewDir;
+							 TRomEntry *aRomEntry;
+							 unsigned long int aOffsetFromBase;
+							 unsigned int aOffset;
+							 string	aName; 
+
+							 while(aOffsetTblCount--) {
+								 aOffsetFromBase = *aOffsetTbl;
+								 aOffsetFromBase  <<= 2;
+								 aRomEntry = (TRomEntry*)((char*)aPaRomDir + sizeof(int) + aOffsetFromBase);
+								 UTF16String unistr(reinterpret_cast<const TUint16*>(aRomEntry->iName),aRomEntry->iNameLength);
+								 if(!unistr.ToUTF8(aName))
+									 aName.assign(reinterpret_cast<const char*>(aRomEntry->iName),aRomEntry->iNameLength);
+
+								 if(aRomEntry->iAtt & 0x10) {//KEntryAttDir
+
+									 aNewFSEntry = new RomImageDirEntry(const_cast<char*>(aName.c_str()));
+									 AddChild(aPaFSEntry, aNewFSEntry, KNull);
+
+									 aOffset = aRomEntry->iAddressLin - RomBase();
+									 aNewDir = (TRomDir*)(RomHdrPtr() + aOffset);
+									 BuildDir(aNewDir, aNewFSEntry);
+								 }
+								 else {
+									 aNewFSEntry = new RomImageFileEntry((char*)aName.data());
+									 AddChild(aPaFSEntry, aNewFSEntry, aRomEntry);
+								 }
+								 aOffsetTbl++;
+							 }
+}
+
+
+/** 
+Function responsible to add current entry as child to aPa.
+
+@internalComponent
+@released
+
+@param aPa - Parent RomImageFSEntry.
+@param aChild - child RomImageFSEntry.
+@param aRomEntry - Current entry.
+*/
+
+void RomReader::AddChild(RomImageFSEntry *aPa, RomImageFSEntry *aChild, TRomEntry* aRomEntry) {
+	if(!aPa->iChildren) {
+		aPa->iChildren = aChild;
+	}
+	else {
+		RomImageFSEntry *aLast = aPa->iChildren;
+		while(aLast->iSibling)
+			aLast = aLast->iSibling;
+
+		aLast->iSibling = aChild;
+	}
+
+	if(!aChild->IsDirectory()) {
+		TRomImageHeader* aImgHdr;
+		unsigned long int aOff;
+		RomImageFileEntry* entry = dynamic_cast<RomImageFileEntry*>(aChild);
+		entry->iTRomEntryPtr = aRomEntry;
+		if(aRomEntry->iAddressLin > RomBase()) {
+			aOff = aRomEntry->iAddressLin - RomBase();
+			aImgHdr = (TRomImageHeader*)(RomHdrPtr() + aOff);
+			entry->ImagePtr.iRomFileEntry = aImgHdr;
+			unsigned char aUid1[4];
+			memcpy(aUid1, &entry->ImagePtr.iRomFileEntry->iUid1, 4);
+
+			//Skip the E32 executables included as a DATA files in ROM image.
+			if(ReaderUtil::IsExecutable(aUid1) && aImgHdr->iCodeAddress > RomBase() && 
+				aImgHdr->iCodeAddress < (RomBase() + ImgSize())) {
+					iExeAvailable = true;
+					entry->iExecutable = true; 
+					pair<ExeVsRomFsEntryMap::iterator,bool> ret =
+						iExeVsRomFsEntryMap.insert(
+							pair<const char*,RomImageFSEntry*>(entry->Name(), aChild));
+					if(ret.second == false)
+						ret.first->second = aChild ;
+						
+			}
+			else {
+				entry->iExecutable = false;
+				entry->ImagePtr.iDataFileAddr = aRomEntry->iAddressLin;
+			}
+		}
+		else {
+			entry->ImagePtr.iRomFileEntry = KNull;
+		}
+	}
+	if(aPa != iRomImageRootDirEntry) {
+		aChild->iPath = aPa->iPath;
+		aChild->iPath += KDirSeperaor;
+		aChild->iPath += aPa->iName.data();
+	}
+
+}
+
+
+/** 
+Function responsible to prepare Executable List by traversing through iExeVsRomFsEntryMap
+
+@internalComponent
+@released
+*/
+void RomReader::PrepareExecutableList() { 
+	for (ExeVsRomFsEntryMap::iterator it = iExeVsRomFsEntryMap.begin() ;
+		it != iExeVsRomFsEntryMap.end(); it++) { 
+		iExecutableList.push_back(it->first); 
+	}
+}
+
+/** 
+Function responsible to create address vs executable map.
+Later this address is used as a key to get executable name
+
+@internalComponent
+@released
+*/
+void RomReader::PrepareAddVsExeMap() {
+	for (ExeVsRomFsEntryMap::iterator it = iExeVsRomFsEntryMap.begin() ;
+		it != iExeVsRomFsEntryMap.end(); it++) { 
+		UintVsString* sizeVsExeName = new UintVsString();
+		unsigned int address;
+		RomImageFileEntry* fileEntry = (RomImageFileEntry*)it->second;
+		TRomImageHeader	*aRomImgEntry = fileEntry->ImagePtr.iRomFileEntry;
+		const char* name = it->second->Name();
+		if(aRomImgEntry != KNull) {
+			address = aRomImgEntry->iCodeAddress;
+			put_item_to_map(*sizeVsExeName,aRomImgEntry->iCodeSize,name);
+		}
+		else {
+			address = fileEntry->iTRomEntryPtr->iAddressLin;
+			put_item_to_map(*sizeVsExeName,fileEntry->iTRomEntryPtr->iSize,name);
+		}
+		put_item_to_map(iAddVsExeMap,address, sizeVsExeName);
+		iImageAddress.push_back(address); 
+	}
+	sort(iImageAddress.begin(), iImageAddress.end(), greater < unsigned int>());
+}
+
+/** 
+Function responsible to say whether it is an ROM image or not.
+
+@internalComponent
+@released
+
+@param aWord - which has the identifier string
+@return - returns true or false.
+*/
+bool RomReader::IsRomImage(const string& aWord) {
+	//Epoc Identifier should start at 0th location, Rom Identifier should start at 8th location
+	if((aWord.find(KEpocIdentifier) == 0) && (aWord.find(KRomImageIdentifier) == 8)) {
+		return true;
+	}
+	else {
+		iNoRomLoaderHeader = true;
+		//TRomLoaderHeader is not present
+		TRomHeader *romHdr = (TRomHeader*)aWord.c_str();
+		/**If the ROM image is built without TRomLoaderHeaderi, ROM specific identifier will not be available
+		hence these two header variables used.*/
+		if((romHdr->iRomBase >= KRomBase) && (romHdr->iRomRootDirectoryList > KRomBase) 
+			&& (romHdr->iRomBase < KRomBaseMaxLimit) && (romHdr->iRomRootDirectoryList < KRomBaseMaxLimit)) {
+				return true;
+		}
+	}
+	return false;
+}
+
+/** 
+Function responsible to say whether it is an ROM extension image or not.
+
+@internalComponent
+@released
+
+@param aWord - which has the identifier string
+@return - retruns true or false.
+*/
+bool RomReader::IsRomExtImage(const string& aWord) {
+	if(aWord.at(0) == KNull && aWord.at(1) == KNull &&
+		aWord.at(2) == KNull && aWord.at(3) == KNull &&
+		aWord.at(4) == KNull && aWord.at(5) == KNull) {
+			//Since no specific identifier is present in the ROM Extension image these two header variables used.
+			TExtensionRomHeader* romHdr = (TExtensionRomHeader*)aWord.c_str();
+			if((romHdr->iRomBase > KRomBase) && (romHdr->iRomRootDirectoryList > KRomBase)
+				&& (romHdr->iRomBase < KRomBaseMaxLimit) && (romHdr->iRomRootDirectoryList < KRomBaseMaxLimit)) {
+					return true;
+			}
+	}
+	return false;
+}
+
+/** 
+Function responsible to gather dependencies for all the executables.
+
+@internalComponent
+@released
+
+@return iImageVsDepList - returns all executable's dependencies
+*/
+ 
+ExeNamesVsDepListMap& RomReader::GatherDependencies() {  
+	PrepareAddVsExeMap();   
+	for(ExeVsRomFsEntryMap::iterator it =  iExeVsRomFsEntryMap.begin();
+		it != iExeVsRomFsEntryMap.end(); it++) {
+		RomImageFileEntry* entry = dynamic_cast<RomImageFileEntry*>(it->second);
+		if(!entry){ 
+			continue ;
+		}
+		if(entry->iTRomEntryPtr->iAddressLin > RomBase()) {
+			StringList executables; 
+			CollectImportExecutableNames(entry, executables); 
+			put_item_to_map(iImageVsDepList,entry->Name(), executables); 
+		} 
+	}
+	return iImageVsDepList;
+}
+
+/** 
+Function responsible to read the dependency names.
+
+@internalComponent
+@released
+
+@param aRomReader - ROM reader pointer
+@param aEntry - Current RomImageFSEntry
+@param aImportExecutableNameList - Executable list.(output)
+*/
+void RomReader::CollectImportExecutableNames(const RomImageFSEntry* aEntry, StringList&  aImportExecutables) { 
+	RomImageFileEntry* fileEntry = (RomImageFileEntry*)aEntry;
+	TRomImageHeader	*romImgEntry = fileEntry->ImagePtr.iRomFileEntry;
+	TUint sectionOffset = romImgEntry->iCodeAddress - RomBase();
+	TUint* codeSection = reinterpret_cast<TUint*>(const_cast<char*>(RomHdrPtr()) + sectionOffset);
+	TUint codeSize = romImgEntry->iCodeSize;
+	// Checking for LDR Instruction in PLT section(Inside Code section)
+	// to get the import address.	
+	bool patternFound = false;	
+	while(codeSize > 0) {
+		if(*codeSection++ == KLdrOpcode) {
+			patternFound = true;
+			TUint dependencyAddress = *codeSection++;
+			
+			unsigned int addr = CodeSectionAddress(dependencyAddress);			 
+			RomAddrVsExeName::iterator it = iAddVsExeMap.find(addr);
+			
+			if(it == iAddVsExeMap.end()) break ; 
+			
+			UintVsString::iterator i = it->second->begin();
+			 
+			if(!(dependencyAddress < (it->first + i->first))) {
+				aImportExecutables.push_back(KUnknownDependency);
+			}
+			else {
+				aImportExecutables.push_back(i->second);
+			}			 
+		}
+		else if(patternFound) {
+			break;
+			
+		}
+		--codeSize;
+	} 
+	aImportExecutables.sort();
+	aImportExecutables.unique();
+}
+typedef iterator_traits<VectorList::iterator>::difference_type Distance;
+static VectorList::iterator get_lower_bound(VectorList aVec, const unsigned int& aVal){
+	VectorList::iterator first = aVec.begin();
+	VectorList::iterator last = aVec.end();
+	Distance len = distance(first, last);
+	Distance half;
+	VectorList::iterator middle;
+
+	while (len > 0) {
+		half = len >> 1;
+		middle = first;
+		advance(middle, half);    
+		if (*middle > aVal) {      
+			first = middle;
+			++first;
+			len = len - half - 1;
+		}
+		else
+			len = half;
+	}
+	return first;
+}
+
+
+/** 
+Function responsible to read the dependency address from the Exe Map container.
+
+@internalComponent
+@released
+
+@param aImageAddress - Dependency address (function address)
+@returns - e32image start address(code section).
+*/
+unsigned int RomReader::CodeSectionAddress(unsigned int& aImageAddress) {
+	/*
+	This invocation leads to a warning, due to the stlport implememtation
+	VectorList::iterator lowerAddress = lower_bound(iImageAddress.begin(), 
+	iImageAddress.end(), aImageAddress, greater <unsigned int>());
+	*/
+
+	VectorList::iterator lowerAddress = get_lower_bound(iImageAddress,aImageAddress);
+	return *lowerAddress;
+}
+
+/** 
+Function responsible to fill iExeVsIdData and iSidVsExeName containers.
+
+@internalComponent
+@released
+
+@param iRomImageRootDirEntry - Root directory entry
+@param iExeVsIdData - Container
+@param iSidVsExeName - Container
+*/
+void RomReader::PrepareExeVsIdMap() {
+	  
+	//IdData* id = KNull;
+	//RomImageFileEntry* entry = KNull;
+	if(iExeVsIdData.size() == 0) { //Is not already prepared 
+		for(ExeVsRomFsEntryMap::iterator it =  iExeVsRomFsEntryMap.begin();
+		it != iExeVsRomFsEntryMap.end() ; it++) {
+			RomImageFileEntry* entry = dynamic_cast<RomImageFileEntry*>(it->second);
+			if(!entry) continue ;			
+			IdData* id = new IdData;
+			id->iUid = entry->ImagePtr.iRomFileEntry->iUid1;
+			id->iDbgFlag = (entry->ImagePtr.iRomFileEntry->iFlags & KImageDebuggable) ? true : false;
+			if(entry->iTRomEntryPtr->iAddressLin > RomBase()) {
+				const char* exeName = it->second->Name();
+				//This header contains the SID and VID, so create the instance of IdData.
+				TRomImageHeader	*aRomImgEntry = entry->ImagePtr.iRomFileEntry;
+
+				id->iSid = aRomImgEntry->iS.iSecureId;
+				id->iVid = aRomImgEntry->iS.iVendorId;
+				id->iFileOffset = aRomImgEntry->iEntryPoint; 
+				put_item_to_map_2(iExeVsIdData,exeName,id);  
+			} 
+		}
+	} 
+}
+
+/** 
+Function responsible to return the Executable versus IdData container. 
+
+@internalComponent
+@released
+
+@return - returns iExeVsIdData
+*/
+const ExeVsIdDataMap& RomReader::GetExeVsIdMap() const {
+	return iExeVsIdData;
+}