diff -r 000000000000 -r 4e1aa6a622a0 sysstatemgmt/systemstarter/amastartsrc/amastartexe.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysstatemgmt/systemstarter/amastartsrc/amastartexe.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,82 @@ +// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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: +// amastarterexe.cpp +// +// + + +#include +#include "amastartexe_patch.h" +#include "amastart.h" + +LOCAL_C void AmaStarterL() + { + //The application should have capabilities at least what AMAStarter has (PowerMgmt, ReadDeviceData, ProtServ) + //to prevent a process being able to get AMAStarter to perform operations it doesn't have the capabilities for. + //The application should also have SID as expected to ensure that AMAStarter.exe cannot be launched by a malicious process + if(!User::CreatorHasCapability(ECapabilityPowerMgmt, ECapabilityProtServ) || + !User::CreatorHasCapability(ECapabilityReadDeviceData)|| + (User::CreatorSecureId() != KSysStartSID)) + { + User::Leave(KErrPermissionDenied); // make sure we are being called by a trusted app for startup purposes + } + + CAmaStart* const amaStart = CAmaStart::NewL(); + CleanupStack::PushL(amaStart); + + //default DSC + TUid id = TUid::Uid(KDefaultSymbianDsc); + const TInt commandSize=User::CommandLineLength(); + if (commandSize >0) + { + RBuf command; + command.CreateL(commandSize); + CleanupClosePushL(command); + + //get the command line argument + User::CommandLine(command); + + TLex lex(command); + TUint dscId=0; + + //Parses the string to extract a TUint32, using hexadecimal + User::LeaveIfError(lex.Val(dscId, EHex)); + id=TUid::Uid(dscId); + + CleanupStack::PopAndDestroy(&command); + } + + amaStart->StartL(id); + CleanupStack::PopAndDestroy(amaStart); + } + + +GLDEF_C TInt E32Main() + { + __UHEAP_MARK; // mark heap state + + CTrapCleanup* theTrapCleanup=CTrapCleanup::New(); + + TInt error=KErrNoMemory; + + if (theTrapCleanup) + { + TRAP(error, AmaStarterL()); + delete theTrapCleanup; + } + + __UHEAP_MARKEND; // check no memory leak + + return(error); + }