diff -r 000000000000 -r ba25891c3a9e secureswitools/swianalysistoolkit/source/dumpswiregistrytool/dumpswiregistrytool.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/secureswitools/swianalysistoolkit/source/dumpswiregistrytool/dumpswiregistrytool.cpp Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,411 @@ +/* +* Copyright (c) 2005-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: +* +*/ + + +#include "dumpswiregistrytool.h" +#ifdef _MSC_VER +#include +#include +#endif /* _MSC_VER */ + +#ifdef _MSC_VER +// House-keeping to allow ::new to throw rather than return NULL in MSVC++ +int throwingHandler(size_t) + { + throw std::bad_alloc(); + return 0; + } +#endif /* _MSC_VER */ + +class DumpRegistryTool tool; + +//entry point +int main(int argc,char *argv[]) + { +#ifdef _MSC_VER + _set_new_handler (throwingHandler); // Make ::new throw rather than return NULL +#endif /* _MSC_VER */ + + if(argc < 2) + { + Options::DisplayUsage(); + return 0; + } + try + { + auto_ptr options(new Options(argc , argv)); + tool.Run(*options); + } + + catch (Exceptions aErr) + { + Options::DisplayError(aErr); + return aErr; + } + + catch (bad_alloc&) + { + cout << "Error Allocating Memory " << endl ; + } + + return 0; + } + +DumpRegistryTool::DumpRegistryTool() + :iRegistryEntryValid(false) , + iFile("\\0") , + iFileMajorVersion (0) , + iFileMinorVersion (0) , + iPkgVendorLocalizedName (0) , + iPkgInstallType (0) , + iRomBasedPkg (0) , + iPkgPreinstalledStatus (0) , + iPkgSignedStatus (0) , + iPkgTrust (0) , + iNotUsed (0) , + iTimeStampl (0) , + iTimeStamph (0) + { + iInstallType[0] = "Installation" ; + iInstallType[1] = "Augmentation" ; + iInstallType[2] = "PartialUpgrade" ; + iInstallType[3] = "PralledApp" ; + iInstallType[4] = "PralledPatch" ; + + iPackageTrust[0] = "SisPackageUnsignedOrSelfSigned" ; + iPackageTrust[50] = "SisPackageValidationFailed" ; + iPackageTrust[100] = "SisPackageCertificateChainNoTrustAnchor" ; + iPackageTrust[200] = "SisPackageCertificateChainValidatedToTrustAnchor" ; + iPackageTrust[300] = "SisPackageChainValidatedToTrustAnchorOCSPTransientError" ; + iPackageTrust[400] = "SisPackageChainValidatedToTrustAnchorAndOCSPValid" ; + iPackageTrust[500] = "SisPackageBuiltIntoRom" ; + + iValidationStatus[0] = "Unknown" ; + iValidationStatus[10] = "Expired" ; + iValidationStatus[20] = "Invalid" ; + iValidationStatus[30] = "Unsigned" ; + iValidationStatus[40] = "Validated" ; + iValidationStatus[50] = "ValidatedToAnchor" ; + iValidationStatus[60] = "PackageInRom" ; + + iRevocationStatus[0] = "Unknown2" ; + iRevocationStatus[10] = "OcspNotPerformed" ; + iRevocationStatus[20] = "OcspRevoked" ; + iRevocationStatus[30] = "OcspUnknown" ; + iRevocationStatus[40] = "OcspTransient" ; + iRevocationStatus[50] = "OcspGood" ; + } + +/** + Calls the ListFilesInDirectory(),which provides a vector containing all the .reg files present in the + package directory specified,and iterates this vector one by one and calls ExtractRegistry() ,to extract the information + from that particular .reg file. + */ + +void DumpRegistryTool::Run(const Options& aOptions) + { + std::vector regFiles; + //-p option specified + if(aOptions.IsPkgUIDSpecified()) + { + regFiles = OSInterface::ExtractFilesFromDirectory(aOptions.PkgUID(), "reg"); + } + + //-r option specified + if(aOptions.IsRegistryEntrySpecified()) + { + regFiles = OSInterface::ExtractFilesFromDirectory(aOptions.RegistryFilePath(), "reg"); + } + + for(vector::const_iterator regIterator = regFiles.begin(); regIterator != regFiles.end(); regIterator++) + { + string file = *regIterator; + const char* fileName = file.c_str(); + bool success = ExtractRegistry(fileName , aOptions); + if(!success) + { + cout << "Package Information:" << endl << endl; + cout << "Registry Entry :" << fileName <<" IS EMPTY " << endl; + } + } + + //if -r option is specified and the registry entry(either pkg name,pkg uid or vendor name is not specified) + //display usage. + if(!iRegistryEntryValid && (aOptions.IsRegistryEntrySpecified())) + { + cout << "Invalid Registry Entry Specified ." << endl << endl; + } + } + +/** + Extracts the particular registry contents. + @param registry file + */ +bool DumpRegistryTool::ExtractRegistry(const char* aRegFile , const Options& aOptions) + { + StreamReader reader(aRegFile); + //check if file is empty + bool isFileEmpty = reader.Initialise(); + if(isFileEmpty) + { + return false; + } + + RegistryPackage package; + RegistryToken token; + token.ExtractRegistryToken(reader,package); + ExtractPackageInformation(reader); + + unsigned int uid = package.PkgUID(); + char uidBuf[KLength]; + itoa(uid,uidBuf,KRadix); + + //if -p option is specified + if(aOptions.IsPkgUIDSpecified()) + { + cout << "Package Information:" << endl << endl; + cout << "Registry File :" << aRegFile << endl << endl; + package.DisplayPackage(); + token.DisplayRegistryToken(); + DisplayPackageInformation(); + } + + //if -r option sis specified. + if(aOptions.IsRegistryEntrySpecified()) + { + int packageUid = CompareUserAndFileSpecifiedData(aOptions.PkgUID(), uidBuf); + int packageName = CompareUserAndFileSpecifiedData(aOptions.PkgName(), package.PackageName()); + int vendorName = CompareUserAndFileSpecifiedData(aOptions.VendorName(), package.Vendor()); + + if(packageUid && packageName && vendorName) + { + iRegistryEntryValid = true; + cout <<"Registry Controller Information:" << endl << endl; + cout << "Registry Entry :" << aRegFile << endl << endl; + package.DisplayPackage(); + unsigned int count = token.GetControllerCount(); + for(int i = 0 ; i < count ; i++) + { + token.ControllerInformation()->DisplayControllerInfo(i); + } + ExtractControllerInformation(reader); + } + } + iFile.close(); + return true; + } + +/** + Extracts the information about sis dependencies,sis embeds, sis file description,sis properties , + validation status and revocation status . + */ + +void DumpRegistryTool::ExtractControllerInformation(StreamReader& aReader) + { + //list of depenedent SISX packages + unsigned int dependencyCount = aReader.ReadInt32(); + cout << "Number of Dependencies : " << dependencyCount << endl << endl; + if(dependencyCount) + { + cout << "Dependencies Information : " << endl << endl; + SISDependency* dependency = new SISDependency[dependencyCount]; + for(int j = 0; j < dependencyCount; j++) + { + dependency[j].ExtractDependency(aReader); + dependency[j].DisplayDependencyInfo(); + } + delete [] dependency; + } + + //list of embedded SISX files + unsigned int embeddedCount = aReader.ReadInt32(); + cout<<"Number of Embedded Packages : " << embeddedCount << endl << endl; + if(embeddedCount) + { + cout << "List Of Embedded Packages:" << endl << endl; + SISEmbeds* embed = new SISEmbeds[embeddedCount]; + for(int i = 0; i < embeddedCount ; i++) + { + embed[i].ExtractEmbeds(aReader); + embed[i].DisplayEmbeddedInfo(); + } + delete [] embed; + } + + //properties for the SISX package,is a key, value pair associated with a SISX package. + unsigned int sisPropertyCount = aReader.ReadInt32(); + cout << "SISProperty Count:"<< sisPropertyCount << endl << endl; + if(sisPropertyCount) + { + cout << "SIS Properties :" << endl << endl; + SISProperty* property = new SISProperty[sisPropertyCount]; + for(int k = 0; k < sisPropertyCount; k++) + { + property[k].ExtractSISProperty(aReader); + property[k].DisplaySISProperty(); + } + delete [] property; + } + + //information about files to be installed . + unsigned int sisFileDescriptionCount = aReader.ReadInt32(); + cout << "Number Of File Descriptions :" << sisFileDescriptionCount << endl << endl; + if(sisFileDescriptionCount) + { + cout << "SIS File Description:" << endl << endl; + SISFileDescription* description = new SISFileDescription[sisFileDescriptionCount]; + for(int l = 0; l < sisFileDescriptionCount; l++) + { + description[l].ExtractSISFileDescription(aReader); + description[l].DisplaySISFileDescription(l); + } + delete [] description; + } + + unsigned int statusOfValidation = aReader.ReadInt32(); + if(tool.iValidationStatus.find(statusOfValidation) !=tool.iValidationStatus.end()) + { + cout<<"Validation Status : "<< iValidationStatus[statusOfValidation] << endl; + } + else + { + cout << "Validation Status : " << "Unknown" << endl; + } + + unsigned int revocationStatus = aReader.ReadInt32(); + if(tool.iRevocationStatus.find(revocationStatus) != tool.iRevocationStatus.end()) + { + cout << "Revocation Status : " << iRevocationStatus[revocationStatus] << endl; + } + else + { + cout << "Revocation Status : " << "Unknown" << endl; + } + + } + +//this function is to check whether the user specified values for registry entries matches the one specified in the .reg file. +int DumpRegistryTool::CompareUserAndFileSpecifiedData(const string& aUserSpecified , const string& aFileSpecified) + { + string::const_iterator userIter = aUserSpecified.begin(); + string::const_iterator fileIter = aFileSpecified.begin(); + + int userSize = aUserSpecified.length(); + int size = aFileSpecified.length(); + + //stop when either string end has reached + while((userIter != aUserSpecified.end()) && (fileIter != aFileSpecified.end())) + { + if(::toupper(*userIter) != ::toupper(*fileIter)) + { + return 0; + } + ++userIter; + ++fileIter; + } + + if(userSize == size) + { + return 1; + } + else + { + return 0; + } + } + + +/** + This function extracts top level information about a package namely install type,whether it is rom based,trust status of package + */ +void DumpRegistryTool::ExtractPackageInformation(StreamReader& aReader) + { + iFileMajorVersion = aReader.ReadInt16(); + iFileMinorVersion = aReader.ReadInt16(); + iPkgVendorLocalizedName = aReader.ReadDescriptor(); + iPkgInstallType = aReader.ReadInt32(); + iRomBasedPkg = aReader.ReadInt32(); //is package ROM Based + iPkgPreinstalledStatus = aReader.ReadInt32(); //is package preinstalled + iPkgSignedStatus = aReader.ReadInt32(); //is package signed + iPkgTrust = aReader.ReadInt32(); //trust status of package + iNotUsed = aReader.ReadInt32(); + iTimeStampl = aReader.ReadInt32(); + iTimeStamph = aReader.ReadInt32(); + } + + +void DumpRegistryTool::DisplayPackageInformation() + { + cout << "File Major Version :" << iFileMajorVersion << endl; + cout << "File Minor Version :" << iFileMinorVersion << endl; + cout << "Package Vendor Localized Name :" << iPkgVendorLocalizedName << endl; + if(tool.iInstallType.find(iPkgInstallType) != tool.iInstallType.end()) + { + cout << "Package Install Type :" << tool.iInstallType[iPkgInstallType] << endl; + } + else + { + cout << "Package Install Type :" << "Unknown" << endl; + } + + if(iRomBasedPkg) + { + cout << "Is Package in ROM :" << "Yes" << endl; + } + else + { + cout<<"Is Package in ROM :"<< "No" <