debugsrv/runmodedebug/securityserver/src/c_security_svr_server.cpp
author hgs
Fri, 08 Oct 2010 14:56:39 +0300
changeset 56 aa2539c91954
parent 42 0ff24a8f6ca2
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
42
hgs
parents:
diff changeset
     1
// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     2
// All rights reserved.
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
56
hgs
parents: 42
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
42
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     7
//
hgs
parents:
diff changeset
     8
// Initial Contributors:
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    10
//
hgs
parents:
diff changeset
    11
// Contributors:
hgs
parents:
diff changeset
    12
//
hgs
parents:
diff changeset
    13
// Description:
hgs
parents:
diff changeset
    14
// Provides the debug security server server implementation.
hgs
parents:
diff changeset
    15
// 
hgs
parents:
diff changeset
    16
//
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include <e32base.h>
hgs
parents:
diff changeset
    19
#include <e32base_private.h>
hgs
parents:
diff changeset
    20
#include <rm_debug_api.h>
hgs
parents:
diff changeset
    21
#include "c_process_pair.h"
hgs
parents:
diff changeset
    22
#include "c_security_svr_session.h"
hgs
parents:
diff changeset
    23
#include "c_security_svr_server.h"
hgs
parents:
diff changeset
    24
#include "rm_debug_logging.h"
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
using namespace Debug;
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
/**
hgs
parents:
diff changeset
    29
Server constructor, sessions are created as ESharableSessions, meaning that
hgs
parents:
diff changeset
    30
each session will be used by at most one debug agent
hgs
parents:
diff changeset
    31
*/
hgs
parents:
diff changeset
    32
CSecuritySvrServer::CSecuritySvrServer(CActive::TPriority aActiveObjectPriority)
hgs
parents:
diff changeset
    33
	: CServer2(aActiveObjectPriority, ESharableSessions),
hgs
parents:
diff changeset
    34
	  iSessionCount(0),
hgs
parents:
diff changeset
    35
	  iShutdown()
hgs
parents:
diff changeset
    36
	{
hgs
parents:
diff changeset
    37
	LOG_MSG("CSecuritySvrServer::CSecuritySvrServer()\n");
hgs
parents:
diff changeset
    38
	}
hgs
parents:
diff changeset
    39
hgs
parents:
diff changeset
    40
/**
hgs
parents:
diff changeset
    41
Standard implementation
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
@return pointer to new CSecuritySvrServer object
hgs
parents:
diff changeset
    44
*/
hgs
parents:
diff changeset
    45
CSecuritySvrServer* CSecuritySvrServer::NewLC()
hgs
parents:
diff changeset
    46
	{
hgs
parents:
diff changeset
    47
	LOG_MSG("CSecuritySvrServer::NewLC()\n");
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
	CSecuritySvrServer* self=new(ELeave) CSecuritySvrServer(EPriorityStandard);
hgs
parents:
diff changeset
    50
	CleanupStack::PushL(self);
hgs
parents:
diff changeset
    51
	self->ConstructL();
hgs
parents:
diff changeset
    52
	return self;
hgs
parents:
diff changeset
    53
	}
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
/**
hgs
parents:
diff changeset
    56
Server destructor, performs cleanup for the server
hgs
parents:
diff changeset
    57
*/
hgs
parents:
diff changeset
    58
CSecuritySvrServer::~CSecuritySvrServer()
hgs
parents:
diff changeset
    59
	{
hgs
parents:
diff changeset
    60
	LOG_MSG("CSecuritySvrServer::~CSecuritySvrServer()\n");
hgs
parents:
diff changeset
    61
hgs
parents:
diff changeset
    62
	// stop the kernel side driver
hgs
parents:
diff changeset
    63
	iKernelDriver.Close();
hgs
parents:
diff changeset
    64
	User::FreeLogicalDevice(KDebugDriverName);
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
	//deallocate both the debug maps
hgs
parents:
diff changeset
    67
	iPassiveDebugMap.ResetAndDestroy();
hgs
parents:
diff changeset
    68
	iActiveDebugMap.ResetAndDestroy();
hgs
parents:
diff changeset
    69
	}
hgs
parents:
diff changeset
    70
hgs
parents:
diff changeset
    71
/**
hgs
parents:
diff changeset
    72
Starts the server and constructs and starts the servers shutdown timer
hgs
parents:
diff changeset
    73
*/
hgs
parents:
diff changeset
    74
void CSecuritySvrServer::ConstructL()
hgs
parents:
diff changeset
    75
	{
hgs
parents:
diff changeset
    76
	LOG_MSG("CSecuritySvrServer::ConstructL()");
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
	StartL(KSecurityServerName);
hgs
parents:
diff changeset
    79
	iShutdown.ConstructL();
hgs
parents:
diff changeset
    80
	iShutdown.Start();
hgs
parents:
diff changeset
    81
hgs
parents:
diff changeset
    82
	//load the kernel driver
hgs
parents:
diff changeset
    83
	TInt err = User::LoadLogicalDevice(KDebugDriverFileName);
hgs
parents:
diff changeset
    84
	if(! ((KErrNone == err) || (KErrAlreadyExists == err)))
hgs
parents:
diff changeset
    85
		{
hgs
parents:
diff changeset
    86
		User::Leave(err);
hgs
parents:
diff changeset
    87
		}
hgs
parents:
diff changeset
    88
	//create an information object for initialising the driver
hgs
parents:
diff changeset
    89
	TRM_DebugDriverInfo driverInfo;
hgs
parents:
diff changeset
    90
	driverInfo.iUserLibraryEnd = 0;
hgs
parents:
diff changeset
    91
	User::LeaveIfError(iKernelDriver.Open(driverInfo));
hgs
parents:
diff changeset
    92
	}
hgs
parents:
diff changeset
    93
hgs
parents:
diff changeset
    94
/**
hgs
parents:
diff changeset
    95
Creates a new session with the DSS. A version check is done to ensure that an
hgs
parents:
diff changeset
    96
up to date version of the DSS is available (according to the DA's needs).
hgs
parents:
diff changeset
    97
The device driver is loaded if necessary and a session with the server and a 
hgs
parents:
diff changeset
    98
handle to the driver opened.
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
@param aRequiredVersion the minimal version of the DSS required by the DA
hgs
parents:
diff changeset
   101
hgs
parents:
diff changeset
   102
@return a pointer to the new sever session, or NULL if any of the 
hgs
parents:
diff changeset
   103
        initialisation process failed
hgs
parents:
diff changeset
   104
*/
hgs
parents:
diff changeset
   105
CSession2* CSecuritySvrServer::NewSessionL(const TVersion& aRequiredVersion, const RMessage2& aMessage) const
hgs
parents:
diff changeset
   106
//
hgs
parents:
diff changeset
   107
// Session constructor
hgs
parents:
diff changeset
   108
//
hgs
parents:
diff changeset
   109
	{
hgs
parents:
diff changeset
   110
	LOG_ARGS("version=%d.%d.%d", aRequiredVersion.iMajor, aRequiredVersion.iMinor, aRequiredVersion.iBuild);
hgs
parents:
diff changeset
   111
hgs
parents:
diff changeset
   112
	//assert compatible version
hgs
parents:
diff changeset
   113
	TVersion currentVersion(KDebugServMajorVersionNumber, KDebugServMinorVersionNumber, KDebugServPatchVersionNumber);
hgs
parents:
diff changeset
   114
	if(!User::QueryVersionSupported(currentVersion, aRequiredVersion))
hgs
parents:
diff changeset
   115
		{
hgs
parents:
diff changeset
   116
		LOG_MSG("Requested version not compatible with this version. Asked for %d.%d.%d but this is %d.%d.%d", aRequiredVersion.iMajor, aRequiredVersion.iMinor, aRequiredVersion.iBuild, KDebugServMajorVersionNumber, KDebugServMinorVersionNumber, KDebugServPatchVersionNumber);
hgs
parents:
diff changeset
   117
		User::Leave(KErrNotSupported);
hgs
parents:
diff changeset
   118
		}
hgs
parents:
diff changeset
   119
	
hgs
parents:
diff changeset
   120
	//get the debug agent's process id
hgs
parents:
diff changeset
   121
	RThread clientThread;
hgs
parents:
diff changeset
   122
	User::LeaveIfError(aMessage.Client(clientThread));
hgs
parents:
diff changeset
   123
	CleanupClosePushL(clientThread);
hgs
parents:
diff changeset
   124
	RProcess clientProcess;
hgs
parents:
diff changeset
   125
	User::LeaveIfError(clientThread.Process(clientProcess));
hgs
parents:
diff changeset
   126
	CleanupStack::PopAndDestroy(&clientThread);
hgs
parents:
diff changeset
   127
	TProcessId processId = clientProcess.Id();
hgs
parents:
diff changeset
   128
	clientProcess.Close();
hgs
parents:
diff changeset
   129
hgs
parents:
diff changeset
   130
	//create session
hgs
parents:
diff changeset
   131
	LOG_MSG("About to call new(ELeave) CSecuritySvrSession()");
hgs
parents:
diff changeset
   132
	CSecuritySvrSession* servSession = new(ELeave) CSecuritySvrSession(processId);
hgs
parents:
diff changeset
   133
hgs
parents:
diff changeset
   134
	CleanupStack::PushL(servSession);
hgs
parents:
diff changeset
   135
	servSession->ConstructL();
hgs
parents:
diff changeset
   136
	CleanupStack::Pop(servSession);
hgs
parents:
diff changeset
   137
	return servSession;
hgs
parents:
diff changeset
   138
	}
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
/**
hgs
parents:
diff changeset
   141
Manages requests from debug agents to attach to target debug processes
hgs
parents:
diff changeset
   142
hgs
parents:
diff changeset
   143
Given the debug agent process ID and the target process name:
hgs
parents:
diff changeset
   144
(1) checks whether the pair is already in either of the debug maps, if so
hgs
parents:
diff changeset
   145
    then returns KErrAlreadyExists
hgs
parents:
diff changeset
   146
(2) if aPassive == ETrue then just add the pair to the passive map and return
hgs
parents:
diff changeset
   147
    whatever the return value of the array write was
hgs
parents:
diff changeset
   148
(3) if aPassive == EFalse then check whether the target debug process is 
hgs
parents:
diff changeset
   149
    already reserved by another debug agent. If it is then return KErrInUse,
hgs
parents:
diff changeset
   150
    otherwise add the pair to the active debug map and return the status 
hgs
parents:
diff changeset
   151
    value of the array write.
hgs
parents:
diff changeset
   152
hgs
parents:
diff changeset
   153
@param aTargetProcessName original FileName of the process to attach to
hgs
parents:
diff changeset
   154
@param aDebugAgentProcessId process ID of the debug agent
hgs
parents:
diff changeset
   155
@param aPassive ETrue if wish to attach passively, EFalse otherwise
hgs
parents:
diff changeset
   156
hgs
parents:
diff changeset
   157
@return KErrNone if successfully attached, otherwise another system wide error
hgs
parents:
diff changeset
   158
        code as above
hgs
parents:
diff changeset
   159
*/
hgs
parents:
diff changeset
   160
TInt CSecuritySvrServer::AttachProcessL(const TDesC& aTargetProcessName, const TProcessId aDebugAgentProcessId, const TBool aPassive)
hgs
parents:
diff changeset
   161
	{
hgs
parents:
diff changeset
   162
	//store the pair of values
hgs
parents:
diff changeset
   163
	LOG_MSG3("CSecuritySvrServer::AttachProcessL() 0x%lx aPassive=%d", aDebugAgentProcessId.Id(), aPassive);
hgs
parents:
diff changeset
   164
hgs
parents:
diff changeset
   165
	CProcessPair *processPair = CProcessPair::NewL(aTargetProcessName, aDebugAgentProcessId);
hgs
parents:
diff changeset
   166
	if(processPair == NULL)
hgs
parents:
diff changeset
   167
		return KErrNoMemory;
hgs
parents:
diff changeset
   168
hgs
parents:
diff changeset
   169
	//check whether the pair already exists in the active debug map
hgs
parents:
diff changeset
   170
	for(TInt i=0; i<iActiveDebugMap.Count(); i++)
hgs
parents:
diff changeset
   171
		{
hgs
parents:
diff changeset
   172
        // Note that the equality is of the debug agent id and the proc name
hgs
parents:
diff changeset
   173
		if(*processPair == *(iActiveDebugMap[i]))
hgs
parents:
diff changeset
   174
			{
hgs
parents:
diff changeset
   175
			//process already exists
hgs
parents:
diff changeset
   176
			LOG_MSG( "  AttachProcessL() error : KErrAlreadyExists in active map\n" );
hgs
parents:
diff changeset
   177
			delete processPair;
hgs
parents:
diff changeset
   178
			return KErrAlreadyExists;
hgs
parents:
diff changeset
   179
			}
hgs
parents:
diff changeset
   180
		}
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
	//check whether the pair already exists in the passive map
hgs
parents:
diff changeset
   183
	for(TInt i=0; i<iPassiveDebugMap.Count(); i++)
hgs
parents:
diff changeset
   184
		{
hgs
parents:
diff changeset
   185
		if(*processPair == *(iPassiveDebugMap[i]))
hgs
parents:
diff changeset
   186
			{
hgs
parents:
diff changeset
   187
			//process already exists
hgs
parents:
diff changeset
   188
			LOG_MSG( "  AttachProcessL() error : KErrAlreadyExists in passive map\n" );
hgs
parents:
diff changeset
   189
			delete processPair;
hgs
parents:
diff changeset
   190
			return KErrAlreadyExists;
hgs
parents:
diff changeset
   191
			}
hgs
parents:
diff changeset
   192
		}
hgs
parents:
diff changeset
   193
hgs
parents:
diff changeset
   194
	if(aPassive)
hgs
parents:
diff changeset
   195
		{
hgs
parents:
diff changeset
   196
		//just add the pair and return
hgs
parents:
diff changeset
   197
		TInt err = iPassiveDebugMap.Append(processPair);
hgs
parents:
diff changeset
   198
		if(err != KErrNone)
hgs
parents:
diff changeset
   199
			{
hgs
parents:
diff changeset
   200
			// couldn't add pair for some unknown reason, so delete the pair
hgs
parents:
diff changeset
   201
			LOG_MSG2( "  AttachProcessL() error %d appending passive process pair", err );
hgs
parents:
diff changeset
   202
			delete processPair;
hgs
parents:
diff changeset
   203
			}
hgs
parents:
diff changeset
   204
		return err;
hgs
parents:
diff changeset
   205
		}
hgs
parents:
diff changeset
   206
	else
hgs
parents:
diff changeset
   207
		{
hgs
parents:
diff changeset
   208
		//check whether the process Id has already been reserved
hgs
parents:
diff changeset
   209
		for(TInt i=0; i<iActiveDebugMap.Count(); i++)
hgs
parents:
diff changeset
   210
			{
hgs
parents:
diff changeset
   211
            // Now check if this is already debugged, but only if its for a particular process.
hgs
parents:
diff changeset
   212
            // We can have several entries from AttachAll calls, and its ok to add them
hgs
parents:
diff changeset
   213
			if( (!processPair->ProcessNameMatches(_L("*"))) &&
hgs
parents:
diff changeset
   214
			    (processPair->ProcessNameMatches(*(iActiveDebugMap[i])) ) )
hgs
parents:
diff changeset
   215
				{
hgs
parents:
diff changeset
   216
				//process already being debugged
hgs
parents:
diff changeset
   217
				LOG_MSG( "  AttachProcessL() error : process already being debugged" );
hgs
parents:
diff changeset
   218
				delete processPair;
hgs
parents:
diff changeset
   219
				return KErrInUse;
hgs
parents:
diff changeset
   220
				}
hgs
parents:
diff changeset
   221
			}
hgs
parents:
diff changeset
   222
		//try to add the pair. 
hgs
parents:
diff changeset
   223
		TInt err = iActiveDebugMap.Append(processPair);
hgs
parents:
diff changeset
   224
		if(err != KErrNone)
hgs
parents:
diff changeset
   225
			{
hgs
parents:
diff changeset
   226
			// couldn't add pair for some unknown reason, so delete the pair
hgs
parents:
diff changeset
   227
			LOG_MSG2( "  AttachProcessL() error %d inserting active process pair", err );
hgs
parents:
diff changeset
   228
			delete processPair;
hgs
parents:
diff changeset
   229
			}
hgs
parents:
diff changeset
   230
		return err;
hgs
parents:
diff changeset
   231
		}
hgs
parents:
diff changeset
   232
	}
hgs
parents:
diff changeset
   233
hgs
parents:
diff changeset
   234
/*
hgs
parents:
diff changeset
   235
Detach from debugging the specified process
hgs
parents:
diff changeset
   236
hgs
parents:
diff changeset
   237
@param aTargetProcessName name of the process to detach from
hgs
parents:
diff changeset
   238
@param aDebugAgentProcessId process ID of the debug agent
hgs
parents:
diff changeset
   239
hgs
parents:
diff changeset
   240
@return KErrNone if successfully detached, KErrNotFound if an attempt is made
hgs
parents:
diff changeset
   241
        to detach from a process which the debug agent hasn't previously attached to
hgs
parents:
diff changeset
   242
*/
hgs
parents:
diff changeset
   243
TInt CSecuritySvrServer::DetachProcess(const TDesC& aTargetProcessName, const TProcessId aDebugAgentProcessId)
hgs
parents:
diff changeset
   244
	{
hgs
parents:
diff changeset
   245
    LOG_MSG2( "CSecuritySvrServer::DetachProcess() for agent with id 0x%lx", aDebugAgentProcessId.Id() );
hgs
parents:
diff changeset
   246
hgs
parents:
diff changeset
   247
	//check whether the pair is in the active debug map
hgs
parents:
diff changeset
   248
	for(TInt i=0; i<iActiveDebugMap.Count(); i++)
hgs
parents:
diff changeset
   249
		{
hgs
parents:
diff changeset
   250
		if(iActiveDebugMap[i]->Equals(aTargetProcessName, aDebugAgentProcessId))
hgs
parents:
diff changeset
   251
			{
hgs
parents:
diff changeset
   252
			//remove the process pair from the active debug map
hgs
parents:
diff changeset
   253
			delete iActiveDebugMap[i];
hgs
parents:
diff changeset
   254
			iActiveDebugMap.Remove(i);
hgs
parents:
diff changeset
   255
			return KErrNone;
hgs
parents:
diff changeset
   256
			}
hgs
parents:
diff changeset
   257
		}
hgs
parents:
diff changeset
   258
hgs
parents:
diff changeset
   259
	//check whether the pair is in the passive debug map
hgs
parents:
diff changeset
   260
	for(TInt i=0; i<iPassiveDebugMap.Count(); i++)
hgs
parents:
diff changeset
   261
		{
hgs
parents:
diff changeset
   262
		if(iPassiveDebugMap[i]->Equals(aTargetProcessName, aDebugAgentProcessId))
hgs
parents:
diff changeset
   263
			{
hgs
parents:
diff changeset
   264
			//remove the process pair from the active debug map
hgs
parents:
diff changeset
   265
			delete iPassiveDebugMap[i];
hgs
parents:
diff changeset
   266
			iPassiveDebugMap.Remove(i);
hgs
parents:
diff changeset
   267
			return KErrNone;
hgs
parents:
diff changeset
   268
			}
hgs
parents:
diff changeset
   269
		}
hgs
parents:
diff changeset
   270
hgs
parents:
diff changeset
   271
	//process pair wasn't in either map
hgs
parents:
diff changeset
   272
	return KErrNotFound;
hgs
parents:
diff changeset
   273
	}
hgs
parents:
diff changeset
   274
hgs
parents:
diff changeset
   275
/**
hgs
parents:
diff changeset
   276
Given a debug agent process ID, removes all references to that debug agent
hgs
parents:
diff changeset
   277
from the debug maps
hgs
parents:
diff changeset
   278
hgs
parents:
diff changeset
   279
@param aMessage message from the debug agent
hgs
parents:
diff changeset
   280
hgs
parents:
diff changeset
   281
@return returns KErrNone if successful, another system wide error code otherwise
hgs
parents:
diff changeset
   282
*/
hgs
parents:
diff changeset
   283
void CSecuritySvrServer::DetachAllProcesses(const TProcessId aDebugAgentProcessId)
hgs
parents:
diff changeset
   284
	{
hgs
parents:
diff changeset
   285
	//check whether the debug agent process ID is in the active debug map
hgs
parents:
diff changeset
   286
	for(TInt i=iActiveDebugMap.Count()-1; i>=0; i--)
hgs
parents:
diff changeset
   287
		{
hgs
parents:
diff changeset
   288
		if(iActiveDebugMap[i]->ProcessIdMatches(aDebugAgentProcessId))
hgs
parents:
diff changeset
   289
			{
hgs
parents:
diff changeset
   290
			//remove the process pair from the active debug map
hgs
parents:
diff changeset
   291
			delete iActiveDebugMap[i];
hgs
parents:
diff changeset
   292
			iActiveDebugMap.Remove(i);
hgs
parents:
diff changeset
   293
			}
hgs
parents:
diff changeset
   294
		}
hgs
parents:
diff changeset
   295
hgs
parents:
diff changeset
   296
	//check whether the debug agent process ID is in the passive debug map
hgs
parents:
diff changeset
   297
	for(TInt i=iPassiveDebugMap.Count()-1; i>=0; i--)
hgs
parents:
diff changeset
   298
		{
hgs
parents:
diff changeset
   299
		if(iPassiveDebugMap[i]->ProcessIdMatches(aDebugAgentProcessId))
hgs
parents:
diff changeset
   300
			{
hgs
parents:
diff changeset
   301
			//remove the process pair from the passive debug map
hgs
parents:
diff changeset
   302
			delete iPassiveDebugMap[i];
hgs
parents:
diff changeset
   303
			iPassiveDebugMap.Remove(i);
hgs
parents:
diff changeset
   304
			}
hgs
parents:
diff changeset
   305
		}
hgs
parents:
diff changeset
   306
	}
hgs
parents:
diff changeset
   307
hgs
parents:
diff changeset
   308
/*
hgs
parents:
diff changeset
   309
Check whether the specified debug agent is attaced to the specfied target
hgs
parents:
diff changeset
   310
process.
hgs
parents:
diff changeset
   311
hgs
parents:
diff changeset
   312
@param aTargetThreadId thread ID of a thread in the target process
hgs
parents:
diff changeset
   313
@param aMessage a message which originates with the debug agent
hgs
parents:
diff changeset
   314
@param aPassive if EFalse then checks whether the debug agent is the active
hgs
parents:
diff changeset
   315
       debugger of the target process. If ETrue then checks whether the debug
hgs
parents:
diff changeset
   316
       agent is attached to the target process, irrespective of whether it is
hgs
parents:
diff changeset
   317
       attached passively or actively
hgs
parents:
diff changeset
   318
hgs
parents:
diff changeset
   319
@return ETrue if attached, EFalse otherwise
hgs
parents:
diff changeset
   320
*/
hgs
parents:
diff changeset
   321
TBool CSecuritySvrServer::CheckAttached(const TThreadId aTargetThreadId, const RMessage2& aMessage, const TBool aPassive)
hgs
parents:
diff changeset
   322
	{
hgs
parents:
diff changeset
   323
	
hgs
parents:
diff changeset
   324
	//get a handle to the target thread
hgs
parents:
diff changeset
   325
	RThread targetThread;
hgs
parents:
diff changeset
   326
	TInt err = targetThread.Open(aTargetThreadId);
hgs
parents:
diff changeset
   327
	if(err != KErrNone)
hgs
parents:
diff changeset
   328
		{
hgs
parents:
diff changeset
   329
		return EFalse;
hgs
parents:
diff changeset
   330
		}
hgs
parents:
diff changeset
   331
hgs
parents:
diff changeset
   332
	//get a handle to the target process
hgs
parents:
diff changeset
   333
	RProcess targetProcess;
hgs
parents:
diff changeset
   334
	err = targetThread.Process(targetProcess);
hgs
parents:
diff changeset
   335
	//finshed with the thread handle so close it
hgs
parents:
diff changeset
   336
	targetThread.Close();
hgs
parents:
diff changeset
   337
	if(err != KErrNone)
hgs
parents:
diff changeset
   338
		return EFalse;
hgs
parents:
diff changeset
   339
hgs
parents:
diff changeset
   340
	//get the target process' file name
hgs
parents:
diff changeset
   341
	TFileName targetFileName = targetProcess.FileName();
hgs
parents:
diff changeset
   342
hgs
parents:
diff changeset
   343
	// Tamperproofing. Ensure that the debug agent really has a superset
hgs
parents:
diff changeset
   344
	// of the target process PlatSec capabilities, as authorised
hgs
parents:
diff changeset
   345
	// by an OEM Debug Token (if any)
hgs
parents:
diff changeset
   346
hgs
parents:
diff changeset
   347
	TSecurityInfo targetSecInfo(targetProcess);
hgs
parents:
diff changeset
   348
hgs
parents:
diff changeset
   349
	// Now compare the capabilities, to ensure the DebugAgent has been authorised with
hgs
parents:
diff changeset
   350
	// sufficient capabilities from its OEM Debug token
hgs
parents:
diff changeset
   351
	CSecuritySvrSession* session = (CSecuritySvrSession*)aMessage.Session();
hgs
parents:
diff changeset
   352
hgs
parents:
diff changeset
   353
	// Presume we need to check the target process is debuggable unless a valid OEM Debug token in effect?
hgs
parents:
diff changeset
   354
	if (!OEMTokenPermitsDebugL(session->GetOEMDebugCapabilities(), targetSecInfo.iCaps) )
hgs
parents:
diff changeset
   355
		{
hgs
parents:
diff changeset
   356
		// No debug token therefore check if the process is debuggable
hgs
parents:
diff changeset
   357
		err = iKernelDriver.IsDebuggable(targetProcess.Id());
hgs
parents:
diff changeset
   358
		}
hgs
parents:
diff changeset
   359
hgs
parents:
diff changeset
   360
	//finished with the process handle so close it
hgs
parents:
diff changeset
   361
	targetProcess.Close();
hgs
parents:
diff changeset
   362
hgs
parents:
diff changeset
   363
	if (err != KErrNone)
hgs
parents:
diff changeset
   364
	{
hgs
parents:
diff changeset
   365
		// The process was not marked as debuggable by the loader, and the OEM
hgs
parents:
diff changeset
   366
		// debug token did not override the lack of a debuggable bit.
hgs
parents:
diff changeset
   367
		// The process was not marked as debuggable by the loader
hgs
parents:
diff changeset
   368
		return EFalse;
hgs
parents:
diff changeset
   369
	}
hgs
parents:
diff changeset
   370
hgs
parents:
diff changeset
   371
	return CheckAttachedProcess(targetFileName, aMessage, aPassive);
hgs
parents:
diff changeset
   372
	}
hgs
parents:
diff changeset
   373
hgs
parents:
diff changeset
   374
/*
hgs
parents:
diff changeset
   375
Check whether the specified debug agent is attaced to the specfied target
hgs
parents:
diff changeset
   376
process.
hgs
parents:
diff changeset
   377
hgs
parents:
diff changeset
   378
@param aTargetProcessId process ID of the target process
hgs
parents:
diff changeset
   379
@param aMessage a message which originates with the debug agent
hgs
parents:
diff changeset
   380
@param aPassive if EFalse then checks whether the debug agent is the active
hgs
parents:
diff changeset
   381
       debugger of the target process. If ETrue then checks whether the debug
hgs
parents:
diff changeset
   382
       agent is attached to the target process, irrespective of whether it is
hgs
parents:
diff changeset
   383
       attached passively or actively
hgs
parents:
diff changeset
   384
hgs
parents:
diff changeset
   385
@return ETrue if attached, EFalse otherwise
hgs
parents:
diff changeset
   386
*/
hgs
parents:
diff changeset
   387
TBool CSecuritySvrServer::CheckAttached(const TProcessId aTargetProcessId, const RMessage2& aMessage, const TBool aPassive)
hgs
parents:
diff changeset
   388
	{
hgs
parents:
diff changeset
   389
	//get a handle to the target process
hgs
parents:
diff changeset
   390
	RProcess targetProcess;
hgs
parents:
diff changeset
   391
	TInt err =targetProcess.Open(aTargetProcessId);
hgs
parents:
diff changeset
   392
	if(err != KErrNone)
hgs
parents:
diff changeset
   393
		{
hgs
parents:
diff changeset
   394
		return EFalse;
hgs
parents:
diff changeset
   395
		}
hgs
parents:
diff changeset
   396
hgs
parents:
diff changeset
   397
	//get the target process' file name
hgs
parents:
diff changeset
   398
	TFileName targetFileName = targetProcess.FileName();
hgs
parents:
diff changeset
   399
hgs
parents:
diff changeset
   400
	// Tamperproofing. Ensure that the debug agent really has a superset
hgs
parents:
diff changeset
   401
	// of the target process PlatSec capabilities, as authorised
hgs
parents:
diff changeset
   402
	// by an OEM Debug Token (if any)
hgs
parents:
diff changeset
   403
hgs
parents:
diff changeset
   404
	TSecurityInfo targetSecInfo(targetProcess);
hgs
parents:
diff changeset
   405
hgs
parents:
diff changeset
   406
	// Now compare the capabilities, to ensure the DebugAgent has been authorised with
hgs
parents:
diff changeset
   407
	// sufficient capabilities from its OEM Debug token
hgs
parents:
diff changeset
   408
	CSecuritySvrSession* session = (CSecuritySvrSession*)aMessage.Session();
hgs
parents:
diff changeset
   409
hgs
parents:
diff changeset
   410
	// Presume we need to check the target process is debuggable unless a valid OEM Debug token in effect?
hgs
parents:
diff changeset
   411
	if ( !OEMTokenPermitsDebugL(session->GetOEMDebugCapabilities(), targetSecInfo.iCaps) )
hgs
parents:
diff changeset
   412
		{
hgs
parents:
diff changeset
   413
		// No debug token therefore check if the process is debuggable
hgs
parents:
diff changeset
   414
		err = iKernelDriver.IsDebuggable(targetProcess.Id());
hgs
parents:
diff changeset
   415
		}
hgs
parents:
diff changeset
   416
hgs
parents:
diff changeset
   417
	//finished with the process handle so close it
hgs
parents:
diff changeset
   418
	targetProcess.Close();
hgs
parents:
diff changeset
   419
hgs
parents:
diff changeset
   420
	if (err != KErrNone)
hgs
parents:
diff changeset
   421
	{
hgs
parents:
diff changeset
   422
		return EFalse;
hgs
parents:
diff changeset
   423
	}
hgs
parents:
diff changeset
   424
hgs
parents:
diff changeset
   425
	return CheckAttachedProcess(targetFileName, aMessage, aPassive);
hgs
parents:
diff changeset
   426
	}
hgs
parents:
diff changeset
   427
hgs
parents:
diff changeset
   428
/*
hgs
parents:
diff changeset
   429
Check whether the specified debug agent is attaced to the specfied target
hgs
parents:
diff changeset
   430
process.
hgs
parents:
diff changeset
   431
hgs
parents:
diff changeset
   432
@param aTargetProcessName 
hgs
parents:
diff changeset
   433
@param aMessage a message which originates with the debug agent
hgs
parents:
diff changeset
   434
hgs
parents:
diff changeset
   435
@return ETrue if attached, EFalse otherwise
hgs
parents:
diff changeset
   436
*/
hgs
parents:
diff changeset
   437
TBool CSecuritySvrServer::CheckAttachedProcess(const TDesC& aTargetProcessName, const RMessage2& aMessage, const TBool aPassive) const
hgs
parents:
diff changeset
   438
	{
hgs
parents:
diff changeset
   439
	//get the debug agent's process id
hgs
parents:
diff changeset
   440
	TProcessId clientProcessId = 0;
hgs
parents:
diff changeset
   441
	TInt err = GetProcessIdFromMessage(clientProcessId, aMessage);
hgs
parents:
diff changeset
   442
	if(err != KErrNone)
hgs
parents:
diff changeset
   443
		return EFalse;
hgs
parents:
diff changeset
   444
hgs
parents:
diff changeset
   445
	//check permissions
hgs
parents:
diff changeset
   446
	if(aPassive)
hgs
parents:
diff changeset
   447
		return IsDebugger(aTargetProcessName, clientProcessId);
hgs
parents:
diff changeset
   448
	else
hgs
parents:
diff changeset
   449
		return IsActiveDebugger(aTargetProcessName, clientProcessId);
hgs
parents:
diff changeset
   450
	}
hgs
parents:
diff changeset
   451
hgs
parents:
diff changeset
   452
/**
hgs
parents:
diff changeset
   453
Tests whether the debug agent is attached actively to the target debug process
hgs
parents:
diff changeset
   454
hgs
parents:
diff changeset
   455
@param aTargetProcessName target debug process' FileName
hgs
parents:
diff changeset
   456
@param aDebugAgentProcessId process ID of a debug agent
hgs
parents:
diff changeset
   457
hgs
parents:
diff changeset
   458
@return ETrue if the specified debug agent is actively attached to the 
hgs
parents:
diff changeset
   459
        specified target debug process, EFalse otherwise
hgs
parents:
diff changeset
   460
*/
hgs
parents:
diff changeset
   461
TBool CSecuritySvrServer::IsActiveDebugger(const TDesC& aTargetProcessName, const TProcessId aDebugAgentProcessId) const
hgs
parents:
diff changeset
   462
	{
hgs
parents:
diff changeset
   463
	//check whether the pair is in the active debug map
hgs
parents:
diff changeset
   464
	for(TInt i=0; i<iActiveDebugMap.Count(); i++)
hgs
parents:
diff changeset
   465
		{
hgs
parents:
diff changeset
   466
		// If both match, which can include aTargetProcessName being "*"
hgs
parents:
diff changeset
   467
		if(iActiveDebugMap[i]->Equals(aTargetProcessName, aDebugAgentProcessId))
hgs
parents:
diff changeset
   468
			{
hgs
parents:
diff changeset
   469
			LOG_MSG2( "CSecuritySvrServer::IsActiveDebugger() for agent id 0x%lx matches name and pid", 
hgs
parents:
diff changeset
   470
					aDebugAgentProcessId.Id() );			
hgs
parents:
diff changeset
   471
			return ETrue;
hgs
parents:
diff changeset
   472
			}
hgs
parents:
diff changeset
   473
		// if the pid matches and the name in the map is "*", indicating that 
hgs
parents:
diff changeset
   474
		// this is an attach all agent, and thus debugging 
hgs
parents:
diff changeset
   475
		if( iActiveDebugMap[i]->ProcessIdMatches(aDebugAgentProcessId) &&
hgs
parents:
diff changeset
   476
			iActiveDebugMap[i]->ProcessNameMatches(_L("*")) )
hgs
parents:
diff changeset
   477
			{
hgs
parents:
diff changeset
   478
			LOG_MSG2( "CSecuritySvrServer::IsActiveDebugger() for AttachAll agent id 0x%lx", 
hgs
parents:
diff changeset
   479
				aDebugAgentProcessId.Id() );
hgs
parents:
diff changeset
   480
			return ETrue;
hgs
parents:
diff changeset
   481
			}
hgs
parents:
diff changeset
   482
		}
hgs
parents:
diff changeset
   483
	//not found so return false
hgs
parents:
diff changeset
   484
	return EFalse;
hgs
parents:
diff changeset
   485
	}
hgs
parents:
diff changeset
   486
hgs
parents:
diff changeset
   487
/**
hgs
parents:
diff changeset
   488
Tests whether the target process is being debugged
hgs
parents:
diff changeset
   489
hgs
parents:
diff changeset
   490
@param aTargetProcessName target process' FileName
hgs
parents:
diff changeset
   491
@param aPassive indicates whether to check for the process being actively debugged,
hgs
parents:
diff changeset
   492
or passively debugged
hgs
parents:
diff changeset
   493
hgs
parents:
diff changeset
   494
@return ETrue if the specified target process is being debugged,
hgs
parents:
diff changeset
   495
        EFalse otherwise
hgs
parents:
diff changeset
   496
*/
hgs
parents:
diff changeset
   497
TBool CSecuritySvrServer::IsDebugged(const TDesC& aTargetProcessName, const TBool aPassive) const
hgs
parents:
diff changeset
   498
	{
hgs
parents:
diff changeset
   499
	//get a reference to the appropriate list
hgs
parents:
diff changeset
   500
	const RPointerArray<CProcessPair>& map = (aPassive) ? iPassiveDebugMap : iActiveDebugMap;
hgs
parents:
diff changeset
   501
hgs
parents:
diff changeset
   502
	//iterate through the map trying to match the aTargetProcessName
hgs
parents:
diff changeset
   503
	for(TInt i=0; i<map.Count(); i++)
hgs
parents:
diff changeset
   504
		{
hgs
parents:
diff changeset
   505
		if(map[i]->ProcessNameMatches(aTargetProcessName))
hgs
parents:
diff changeset
   506
			{
hgs
parents:
diff changeset
   507
			return ETrue;
hgs
parents:
diff changeset
   508
			}
hgs
parents:
diff changeset
   509
		}
hgs
parents:
diff changeset
   510
	return EFalse;
hgs
parents:
diff changeset
   511
	}
hgs
parents:
diff changeset
   512
hgs
parents:
diff changeset
   513
/**
hgs
parents:
diff changeset
   514
Tests whether the debug agent is attached to the target debug process
hgs
parents:
diff changeset
   515
hgs
parents:
diff changeset
   516
@param aTargetProcessName target debug process' FileName
hgs
parents:
diff changeset
   517
@param aDebugAgentProcessId process ID of a debug agent
hgs
parents:
diff changeset
   518
hgs
parents:
diff changeset
   519
@return ETrue if the specified debug agent is attached to the 
hgs
parents:
diff changeset
   520
        specified target debug process (regardless of whether it is attached
hgs
parents:
diff changeset
   521
	passively or actively), EFalse otherwise
hgs
parents:
diff changeset
   522
*/
hgs
parents:
diff changeset
   523
TBool CSecuritySvrServer::IsDebugger(const TDesC& aTargetProcessName, const TProcessId aDebugAgentProcessId) const
hgs
parents:
diff changeset
   524
	{
hgs
parents:
diff changeset
   525
	//check whether the pair is in the active debug map
hgs
parents:
diff changeset
   526
	if(IsActiveDebugger(aTargetProcessName, aDebugAgentProcessId))
hgs
parents:
diff changeset
   527
		return ETrue; 
hgs
parents:
diff changeset
   528
hgs
parents:
diff changeset
   529
	//check whether the pair is in the passive debug map
hgs
parents:
diff changeset
   530
	for(TInt i=0; i<iPassiveDebugMap.Count(); i++)
hgs
parents:
diff changeset
   531
		{
hgs
parents:
diff changeset
   532
		if(iPassiveDebugMap[i]->Equals(aTargetProcessName, aDebugAgentProcessId))
hgs
parents:
diff changeset
   533
			return ETrue;
hgs
parents:
diff changeset
   534
		}
hgs
parents:
diff changeset
   535
	//not found so return false
hgs
parents:
diff changeset
   536
	return EFalse;
hgs
parents:
diff changeset
   537
	}
hgs
parents:
diff changeset
   538
hgs
parents:
diff changeset
   539
/**
hgs
parents:
diff changeset
   540
Decrements the server's count of how many sessions are connected to it and
hgs
parents:
diff changeset
   541
starts the shutdown timer if there are no sessions connected
hgs
parents:
diff changeset
   542
*/
hgs
parents:
diff changeset
   543
void CSecuritySvrServer::SessionClosed()
hgs
parents:
diff changeset
   544
	{
hgs
parents:
diff changeset
   545
	if(--iSessionCount < 1)
hgs
parents:
diff changeset
   546
		{
hgs
parents:
diff changeset
   547
		iShutdown.Start();
hgs
parents:
diff changeset
   548
		}
hgs
parents:
diff changeset
   549
	}
hgs
parents:
diff changeset
   550
hgs
parents:
diff changeset
   551
/**
hgs
parents:
diff changeset
   552
Increments the servers count of how many sessions are connected to it and
hgs
parents:
diff changeset
   553
cancels the shutdown timer if it is running
hgs
parents:
diff changeset
   554
*/
hgs
parents:
diff changeset
   555
void CSecuritySvrServer::SessionOpened()
hgs
parents:
diff changeset
   556
	{
hgs
parents:
diff changeset
   557
	iSessionCount++;
hgs
parents:
diff changeset
   558
	iShutdown.Cancel();
hgs
parents:
diff changeset
   559
	}
hgs
parents:
diff changeset
   560
hgs
parents:
diff changeset
   561
/** 
hgs
parents:
diff changeset
   562
  Get the process id of the thread which sent aMessage
hgs
parents:
diff changeset
   563
  @param aProcessId process id of the thread which sent aMessage
hgs
parents:
diff changeset
   564
  @param aMessage message object sent by thread 
hgs
parents:
diff changeset
   565
hgs
parents:
diff changeset
   566
  @return KErrNone if aProcessId could be set, or one of the system wide error codes if not
hgs
parents:
diff changeset
   567
  */
hgs
parents:
diff changeset
   568
TInt CSecuritySvrServer::GetProcessIdFromMessage(TProcessId& aProcessId, const RMessage2& aMessage) const
hgs
parents:
diff changeset
   569
	{
hgs
parents:
diff changeset
   570
	//get the debug agent's thread
hgs
parents:
diff changeset
   571
	RThread clientThread;
hgs
parents:
diff changeset
   572
	TInt err = aMessage.Client(clientThread);
hgs
parents:
diff changeset
   573
	if(err != KErrNone)
hgs
parents:
diff changeset
   574
		{
hgs
parents:
diff changeset
   575
		return err;
hgs
parents:
diff changeset
   576
		}
hgs
parents:
diff changeset
   577
hgs
parents:
diff changeset
   578
	//get the debug agent's process
hgs
parents:
diff changeset
   579
	RProcess clientProcess;
hgs
parents:
diff changeset
   580
	err = clientThread.Process(clientProcess);
hgs
parents:
diff changeset
   581
hgs
parents:
diff changeset
   582
	//finished with the thread handle so close it
hgs
parents:
diff changeset
   583
	clientThread.Close();
hgs
parents:
diff changeset
   584
hgs
parents:
diff changeset
   585
	//check if there was an error from getting the process
hgs
parents:
diff changeset
   586
	if(err != KErrNone)
hgs
parents:
diff changeset
   587
		{
hgs
parents:
diff changeset
   588
		return err;
hgs
parents:
diff changeset
   589
		}
hgs
parents:
diff changeset
   590
hgs
parents:
diff changeset
   591
	//get the debug agent's process id
hgs
parents:
diff changeset
   592
	aProcessId = clientProcess.Id();
hgs
parents:
diff changeset
   593
hgs
parents:
diff changeset
   594
	//finished with the process handle so close it
hgs
parents:
diff changeset
   595
	clientProcess.Close();
hgs
parents:
diff changeset
   596
hgs
parents:
diff changeset
   597
	return KErrNone;
hgs
parents:
diff changeset
   598
	}
hgs
parents:
diff changeset
   599
hgs
parents:
diff changeset
   600
/**
hgs
parents:
diff changeset
   601
  Helper function which determines whether the capabilities of the
hgs
parents:
diff changeset
   602
  OEM Token are sufficient to permit debug of an application.
hgs
parents:
diff changeset
   603
hgs
parents:
diff changeset
   604
  Normally, we use the AllFiles capability as a proxy which
hgs
parents:
diff changeset
   605
  means a Debug Agent can debug non-debuggable executables,
hgs
parents:
diff changeset
   606
  provided it has a superset of the capabilities of the executable
hgs
parents:
diff changeset
   607
  to be debugged.
hgs
parents:
diff changeset
   608
 
hgs
parents:
diff changeset
   609
  However, this causes the problem that all OEM Debug Tokens implicitly
hgs
parents:
diff changeset
   610
  give the power to debug an AllFiles executable, even if all that
hgs
parents:
diff changeset
   611
  is really needed is the power to debug an app with no capabilities,
hgs
parents:
diff changeset
   612
  or capabilities other than AllFiles.
hgs
parents:
diff changeset
   613
  
hgs
parents:
diff changeset
   614
  To address this, we treat the AllFiles capability in a special way.
hgs
parents:
diff changeset
   615
  The AllFiles capability in a token is taken to mean that an OEM has
hgs
parents:
diff changeset
   616
  signed the token, and hence can debug other executables. But this does
hgs
parents:
diff changeset
   617
  not inclue the ability to debug an AllFiles executable. To debug an AllFiles
hgs
parents:
diff changeset
   618
  executable, the token must also have TCB.
hgs
parents:
diff changeset
   619
hgs
parents:
diff changeset
   620
  @param aTokenCaps - The PlatSec capabilities of a token
hgs
parents:
diff changeset
   621
  @param aTargetCaps - The PlatSec capabilities of a target app to be debugged
hgs
parents:
diff changeset
   622
hgs
parents:
diff changeset
   623
  @return ETrue if authorised for debugging, EFalse otherwise.
hgs
parents:
diff changeset
   624
hgs
parents:
diff changeset
   625
  @leave Any system error code.
hgs
parents:
diff changeset
   626
  */
hgs
parents:
diff changeset
   627
TBool CSecuritySvrServer::OEMTokenPermitsDebugL(const TCapabilitySet aTokenCaps, const TCapabilitySet aTargetCaps)
hgs
parents:
diff changeset
   628
	{	
hgs
parents:
diff changeset
   629
	LOG_MSG("CSecuritySvrSession::OEMTokenPermitsDebugL\n");
hgs
parents:
diff changeset
   630
hgs
parents:
diff changeset
   631
	// Is the token valid - i.e. does it have AllFiles.
hgs
parents:
diff changeset
   632
	if ( !aTokenCaps.HasCapability(ECapabilityAllFiles) )
hgs
parents:
diff changeset
   633
		{
hgs
parents:
diff changeset
   634
		// Token is not valid, as it does not have AllFiles.
hgs
parents:
diff changeset
   635
		LOG_MSG("CSecuritySvrSession::OEMTokenPermitsDebugL - Token does not have AllFiles\n");
hgs
parents:
diff changeset
   636
			
hgs
parents:
diff changeset
   637
		return EFalse;
hgs
parents:
diff changeset
   638
		}
hgs
parents:
diff changeset
   639
hgs
parents:
diff changeset
   640
	// Token MUST have a strict superset of capabilities
hgs
parents:
diff changeset
   641
	if ( !aTokenCaps.HasCapabilities(aTargetCaps) )
hgs
parents:
diff changeset
   642
		{
hgs
parents:
diff changeset
   643
		// Token does not have at least all the capabilities of the target
hgs
parents:
diff changeset
   644
		LOG_MSG("CSecuritySvrSession::OEMTokenPermitsDebugL - Token does not have superset of target capabilities\n");
hgs
parents:
diff changeset
   645
hgs
parents:
diff changeset
   646
		return EFalse;
hgs
parents:
diff changeset
   647
		}
hgs
parents:
diff changeset
   648
hgs
parents:
diff changeset
   649
	// Special case: If the target has AllFiles, the Token must have TCB
hgs
parents:
diff changeset
   650
	if ( aTargetCaps.HasCapability(ECapabilityAllFiles) )
hgs
parents:
diff changeset
   651
		{
hgs
parents:
diff changeset
   652
		// Target has AllFiles, so does the Token have TCB?
hgs
parents:
diff changeset
   653
		if ( !aTokenCaps.HasCapability(ECapabilityTCB) )
hgs
parents:
diff changeset
   654
			{
hgs
parents:
diff changeset
   655
			// Token does not have TCB.
hgs
parents:
diff changeset
   656
			LOG_MSG("CSecuritySvrSession::OEMTokenPermitsDebugL - Token does not have TCB when target has AllFiles\n");
hgs
parents:
diff changeset
   657
	
hgs
parents:
diff changeset
   658
			return EFalse;
hgs
parents:
diff changeset
   659
			}
hgs
parents:
diff changeset
   660
		}
hgs
parents:
diff changeset
   661
hgs
parents:
diff changeset
   662
	// If we have passed all the above tests, the token permits debug
hgs
parents:
diff changeset
   663
	return ETrue;
hgs
parents:
diff changeset
   664
	}
hgs
parents:
diff changeset
   665
hgs
parents:
diff changeset
   666
/**
hgs
parents:
diff changeset
   667
 * This looks at a debug tokens capability and ensures it is sufficient 
hgs
parents:
diff changeset
   668
 * to provide access to the flash partition
hgs
parents:
diff changeset
   669
 * @param aTokenCaps Capabilties of the Token
hgs
parents:
diff changeset
   670
 * @return TBool Whether or not flash access is permitted
hgs
parents:
diff changeset
   671
 */
hgs
parents:
diff changeset
   672
TBool CSecuritySvrServer::OEMTokenPermitsFlashAccessL(const TCapabilitySet aTokenCaps)
hgs
parents:
diff changeset
   673
	{	
hgs
parents:
diff changeset
   674
	//Must have TCB to access flash
hgs
parents:
diff changeset
   675
	return aTokenCaps.HasCapability(ECapabilityTCB);
hgs
parents:
diff changeset
   676
	}
hgs
parents:
diff changeset
   677
hgs
parents:
diff changeset
   678
//eof
hgs
parents:
diff changeset
   679