diff -r 000000000000 -r ba25891c3a9e secureswitools/swisistools/source/sisxlibrary/sisfiledata.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/secureswitools/swisistools/source/sisxlibrary/sisfiledata.cpp Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,137 @@ +/* +* 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 +#include + +#include "sisfiledata.h" +#include "blob.h" +#include "utility.h" + + +void CSISFileData::Load (const std::wstring& aFile, TUint64* aSize) + + { + TUint64 size = 0; + HANDLE file = OpenFileAndGetSize (aFile, &size); + try + { + iData.Content ().SetByteCount (size); + } + catch (...) + { + ::CloseHandle(file); + throw; + } + ReadAndCloseFile (file, size, iData.Content ().Data ()); + if (aSize) + { + *aSize = size; + } + } + +TUint32 CSISFileData::GetSid() const + { + const int fileLength = UncompressedSize(); + if(fileLength <= sizeof(TUint32)*0x05) + { + return 0; + } + + const unsigned char* data8 = Data(); + const TUint32* data32 = reinterpret_cast(data8); + + TUint32 ret = 0; + // Check the file signature. If its a ARM based symbian executable + // then the signature should be "EPOC". Check E32ImageHeader for more + // details + if ( data32[0x04] == KFileHeaderSignature ) + { + // If its a symbian executable then check the SID + // of the executable. + if(fileLength > (0x80 + sizeof(TUint32))) + { + ret = *((TUint32*) (data8 + 0x80 )); + } + } + else if (data8[0] == 'M' && data8[1] == 'Z') + { + // Emulator executable has a different format. + // All symbian emulator based executable will have ".SYMBIAN" + // in it. Symbian header will be after this signature. + // So search for this marker to read symbian file header. + const char symbian[] = ".SYMBIAN"; + const int len2 = sizeof(symbian)-1; + + const unsigned char* index = std::search(data8, data8+fileLength, symbian, symbian+len2); + if (index != data8+fileLength) + { + index += KHeaderUidLength; + TInt32 offset = *(TInt32*)index; + + // There should be enough data to read the UIDs from the file. + if(fileLength <= (offset + 4*sizeof(TUint32))) + { + return 0; + } + + const TUint32* x = (TUint32*)(data8+offset); + // The three UIDs (12 bytes) of the file + // x[0] = the structure of the file + // x[1] = identifies the interface the polymorphic DLL implements + // or for shared library DLLs that others link to, this value is always the same + // or for executables the UID value has to be set to KUidApp or NULL + // x[3] = distinguishes between objects with the same UID2 + // and can be thought of as a project identifier + if (x[0] == KExecutableImageUid) + { + ret = x[4]; + } + } + } + return ret; + } + + +bool CSISFileData::IsExecutable() const + { + return IsExecutableData(Data(), UncompressedSize()); + } + +bool CSISFileData::IsEmulatorExecutable() const + { + return IsEmulatorExecutableData(Data(), UncompressedSize()); + } + +bool CSISFileData::IsExe() const + { + return IsExeData(Data(), UncompressedSize()); + } + +bool CSISFileData::IsDll() const + { + return IsDllData(Data(), UncompressedSize()); + } + +