debugsrv/runmodedebug/securityserver/src/c_security_svr_session.cpp
author hgs
Fri, 27 Aug 2010 11:37:29 +0300
changeset 42 0ff24a8f6ca2
child 56 aa2539c91954
permissions -rw-r--r--
201033
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
42
hgs
parents:
diff changeset
     1
// Copyright (c) 2006-2010 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
hgs
parents:
diff changeset
     4
// under the terms of the License "Eclipse Public License v1.0"
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 session implementation.
hgs
parents:
diff changeset
    15
// 
hgs
parents:
diff changeset
    16
//
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
/**
hgs
parents:
diff changeset
    19
 @file
hgs
parents:
diff changeset
    20
 @internalTechnology
hgs
parents:
diff changeset
    21
 @released
hgs
parents:
diff changeset
    22
*/
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
// Needed so we get the text strings for capabilities
hgs
parents:
diff changeset
    25
#define __INCLUDE_CAPABILITY_NAMES__
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
#include <e32std.h>
hgs
parents:
diff changeset
    28
#include <e32std_private.h>
hgs
parents:
diff changeset
    29
#include <e32btrace.h>
hgs
parents:
diff changeset
    30
#include <d32btrace.h>
hgs
parents:
diff changeset
    31
#include <e32base.h>
hgs
parents:
diff changeset
    32
#include <e32base_private.h>
hgs
parents:
diff changeset
    33
#include <e32uid.h>
hgs
parents:
diff changeset
    34
#include <f32file.h>
hgs
parents:
diff changeset
    35
#include <e32capability.h>
hgs
parents:
diff changeset
    36
#include <rm_debug_api.h>
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
// required for direct parsing of e32image/tromimage headers
hgs
parents:
diff changeset
    39
#include <f32image.h>
hgs
parents:
diff changeset
    40
#include <e32rom.h>
hgs
parents:
diff changeset
    41
hgs
parents:
diff changeset
    42
//added for direct access to media driver
hgs
parents:
diff changeset
    43
#include <partitions.h>
hgs
parents:
diff changeset
    44
#include <ftlcontrolio.h>
hgs
parents:
diff changeset
    45
hgs
parents:
diff changeset
    46
#include "c_security_svr_session.h"
hgs
parents:
diff changeset
    47
#include "c_security_svr_server.h"
hgs
parents:
diff changeset
    48
#include "c_security_svr_async.h"
hgs
parents:
diff changeset
    49
#include "rm_debug_logging.h"
hgs
parents:
diff changeset
    50
#ifdef _DEBUG
hgs
parents:
diff changeset
    51
#include "low_mem_requests.h"
hgs
parents:
diff changeset
    52
#endif
hgs
parents:
diff changeset
    53
hgs
parents:
diff changeset
    54
using namespace Debug;
hgs
parents:
diff changeset
    55
hgs
parents:
diff changeset
    56
CSecuritySvrSession::CSecuritySvrSession(const TProcessId& aDebugAgentProcessId)
hgs
parents:
diff changeset
    57
	: iDebugAgentProcessId(aDebugAgentProcessId),
hgs
parents:
diff changeset
    58
	  iServerNotified(EFalse),
hgs
parents:
diff changeset
    59
	  iCrashConnected(EFalse)
hgs
parents:
diff changeset
    60
	{
hgs
parents:
diff changeset
    61
	// Ensure that this debug agent has no target capability override
hgs
parents:
diff changeset
    62
	// by default
hgs
parents:
diff changeset
    63
	iOEMDebugCapabilities.SetEmpty();
hgs
parents:
diff changeset
    64
	}
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
void CSecuritySvrSession::ServiceError(const RMessage2 &aMessage, TInt aError)
hgs
parents:
diff changeset
    67
	{
hgs
parents:
diff changeset
    68
	LOG_MSG2("CSecuritySvrSession::ServiceError(), aError: %d\n", aError);
hgs
parents:
diff changeset
    69
hgs
parents:
diff changeset
    70
	//insert ending heap markers
hgs
parents:
diff changeset
    71
	HeapWatcher(aMessage.Function(), EFalse);
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
	aMessage.Complete(aError);
hgs
parents:
diff changeset
    74
	}
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
/**
hgs
parents:
diff changeset
    77
Called by the client/server framework as part of session creation.
hgs
parents:
diff changeset
    78
hgs
parents:
diff changeset
    79
Notifies the server that a session is being created
hgs
parents:
diff changeset
    80
*/
hgs
parents:
diff changeset
    81
void CSecuritySvrSession::CreateL()
hgs
parents:
diff changeset
    82
	{
hgs
parents:
diff changeset
    83
	LOG_MSG("CSecuritySvrSession::CreateL()\n");
hgs
parents:
diff changeset
    84
hgs
parents:
diff changeset
    85
	//notify the server that the session has been opened
hgs
parents:
diff changeset
    86
	Server().SessionOpened();
hgs
parents:
diff changeset
    87
	iServerNotified = ETrue;
hgs
parents:
diff changeset
    88
	}
hgs
parents:
diff changeset
    89
hgs
parents:
diff changeset
    90
/**
hgs
parents:
diff changeset
    91
  Returns a reference to the DSS
hgs
parents:
diff changeset
    92
hgs
parents:
diff changeset
    93
  @return a reference to the DSS
hgs
parents:
diff changeset
    94
  */
hgs
parents:
diff changeset
    95
CSecuritySvrServer& CSecuritySvrSession::Server() const
hgs
parents:
diff changeset
    96
    {
hgs
parents:
diff changeset
    97
    return *static_cast<CSecuritySvrServer*>(const_cast<CServer2*>(CSession2::Server()));
hgs
parents:
diff changeset
    98
    }
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
/**
hgs
parents:
diff changeset
   101
Session destructor. Performs necessary cleanup and notifies the server that the
hgs
parents:
diff changeset
   102
session is being closed
hgs
parents:
diff changeset
   103
*/
hgs
parents:
diff changeset
   104
CSecuritySvrSession::~CSecuritySvrSession()
hgs
parents:
diff changeset
   105
	{
hgs
parents:
diff changeset
   106
	LOG_MSG("CSecuritySvrSession::~CSecuritySvrSession!()\n");
hgs
parents:
diff changeset
   107
hgs
parents:
diff changeset
   108
	// Cancel any outstanding async objects.
hgs
parents:
diff changeset
   109
	iAsyncHandlers.ResetAndDestroy();
hgs
parents:
diff changeset
   110
		
hgs
parents:
diff changeset
   111
	// Inform the device driver of the agent detach.
hgs
parents:
diff changeset
   112
	Server().iKernelDriver.DetachAgent(iDebugAgentProcessId.Id());
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
	LOG_MSG( "CSecuritySvrSession::~CSecuritySvrSession() : -> securityServer.DetachAllProcesses()\n" );
hgs
parents:
diff changeset
   115
	Server().DetachAllProcesses(iDebugAgentProcessId);
hgs
parents:
diff changeset
   116
hgs
parents:
diff changeset
   117
	//notify the server that the session has closed
hgs
parents:
diff changeset
   118
	if(iServerNotified)
hgs
parents:
diff changeset
   119
		{
hgs
parents:
diff changeset
   120
		Server().SessionClosed();
hgs
parents:
diff changeset
   121
		}
hgs
parents:
diff changeset
   122
	}
hgs
parents:
diff changeset
   123
hgs
parents:
diff changeset
   124
void CSecuritySvrSession::ConstructL()
hgs
parents:
diff changeset
   125
	{
hgs
parents:
diff changeset
   126
	// nothing to do
hgs
parents:
diff changeset
   127
	}
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
/**
hgs
parents:
diff changeset
   130
  Used to insert heap checking markers.
hgs
parents:
diff changeset
   131
hgs
parents:
diff changeset
   132
  @param aFunction The function that heap markers should be added for
hgs
parents:
diff changeset
   133
  @param aEntry if ETrue indicates that heap checking is starting, if EFalse
hgs
parents:
diff changeset
   134
  that heap checking is ending.
hgs
parents:
diff changeset
   135
  */
hgs
parents:
diff changeset
   136
void CSecuritySvrSession::HeapWatcher(const TUint32 aFunction, const TBool aEntry) const
hgs
parents:
diff changeset
   137
	{
hgs
parents:
diff changeset
   138
	switch(aFunction)
hgs
parents:
diff changeset
   139
		{
hgs
parents:
diff changeset
   140
		case EDebugServAttachExecutable:
hgs
parents:
diff changeset
   141
			return;
hgs
parents:
diff changeset
   142
		case EDebugServDetachExecutable:
hgs
parents:
diff changeset
   143
			return;
hgs
parents:
diff changeset
   144
		case EDebugServSuspendThread:
hgs
parents:
diff changeset
   145
			return;
hgs
parents:
diff changeset
   146
		case EDebugServResumeThread:
hgs
parents:
diff changeset
   147
			return;
hgs
parents:
diff changeset
   148
		case EDebugServAttachAll:
hgs
parents:
diff changeset
   149
			return;
hgs
parents:
diff changeset
   150
		case EDebugServDetachAll:
hgs
parents:
diff changeset
   151
			return;
hgs
parents:
diff changeset
   152
// used for out-of-memory testing in debug mode
hgs
parents:
diff changeset
   153
#ifdef _DEBUG
hgs
parents:
diff changeset
   154
		// start heap marking in on entry, do nothing on exit
hgs
parents:
diff changeset
   155
		case EDebugServMarkHeap:
hgs
parents:
diff changeset
   156
			{
hgs
parents:
diff changeset
   157
			if(aEntry)
hgs
parents:
diff changeset
   158
				{
hgs
parents:
diff changeset
   159
				__UHEAP_MARK;
hgs
parents:
diff changeset
   160
				}
hgs
parents:
diff changeset
   161
			return;
hgs
parents:
diff changeset
   162
			}
hgs
parents:
diff changeset
   163
		// stop heap marking on exit, do nothing on entry
hgs
parents:
diff changeset
   164
		case EDebugServMarkEnd:
hgs
parents:
diff changeset
   165
			{
hgs
parents:
diff changeset
   166
			if(!aEntry)
hgs
parents:
diff changeset
   167
				{
hgs
parents:
diff changeset
   168
				__UHEAP_MARKEND;
hgs
parents:
diff changeset
   169
				}
hgs
parents:
diff changeset
   170
			return;
hgs
parents:
diff changeset
   171
			}
hgs
parents:
diff changeset
   172
#endif
hgs
parents:
diff changeset
   173
		default:
hgs
parents:
diff changeset
   174
			if(aEntry)
hgs
parents:
diff changeset
   175
				{
hgs
parents:
diff changeset
   176
				__UHEAP_MARK;
hgs
parents:
diff changeset
   177
				}
hgs
parents:
diff changeset
   178
			else
hgs
parents:
diff changeset
   179
				{
hgs
parents:
diff changeset
   180
				__UHEAP_MARKEND;
hgs
parents:
diff changeset
   181
				}
hgs
parents:
diff changeset
   182
			return;
hgs
parents:
diff changeset
   183
		}
hgs
parents:
diff changeset
   184
	}
hgs
parents:
diff changeset
   185
hgs
parents:
diff changeset
   186
void CSecuritySvrSession::ServiceL(const RMessage2& aMessage)
hgs
parents:
diff changeset
   187
//
hgs
parents:
diff changeset
   188
// Session service handler
hgs
parents:
diff changeset
   189
//
hgs
parents:
diff changeset
   190
	{
hgs
parents:
diff changeset
   191
	//insert starting heap markers
hgs
parents:
diff changeset
   192
	HeapWatcher(aMessage.Function(), ETrue);
hgs
parents:
diff changeset
   193
hgs
parents:
diff changeset
   194
	switch(aMessage.Function())
hgs
parents:
diff changeset
   195
		{
hgs
parents:
diff changeset
   196
		case EDebugServResumeThread:
hgs
parents:
diff changeset
   197
			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServResumeThread\n" );
hgs
parents:
diff changeset
   198
			ResumeThreadL(aMessage);
hgs
parents:
diff changeset
   199
			break;
hgs
parents:
diff changeset
   200
hgs
parents:
diff changeset
   201
		case EDebugServSuspendThread:
hgs
parents:
diff changeset
   202
			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServSuspendThread\n" );
hgs
parents:
diff changeset
   203
			SuspendThreadL(aMessage);
hgs
parents:
diff changeset
   204
			break;
hgs
parents:
diff changeset
   205
hgs
parents:
diff changeset
   206
		case EDebugServReadMemory:
hgs
parents:
diff changeset
   207
			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServReadMemory\n" );
hgs
parents:
diff changeset
   208
			ReadMemoryL(aMessage);
hgs
parents:
diff changeset
   209
			break;
hgs
parents:
diff changeset
   210
hgs
parents:
diff changeset
   211
		case EDebugServWriteMemory:
hgs
parents:
diff changeset
   212
			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServWriteMemory\n" );
hgs
parents:
diff changeset
   213
			WriteMemoryL(aMessage);
hgs
parents:
diff changeset
   214
			break;
hgs
parents:
diff changeset
   215
hgs
parents:
diff changeset
   216
		case EDebugServSetBreak:
hgs
parents:
diff changeset
   217
			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServSetBreak\n" );
hgs
parents:
diff changeset
   218
			SetBreakL(aMessage);
hgs
parents:
diff changeset
   219
			break;
hgs
parents:
diff changeset
   220
hgs
parents:
diff changeset
   221
		case EDebugServClearBreak:
hgs
parents:
diff changeset
   222
			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServClearBreak\n" );
hgs
parents:
diff changeset
   223
			ClearBreakL(aMessage);
hgs
parents:
diff changeset
   224
			break;
hgs
parents:
diff changeset
   225
hgs
parents:
diff changeset
   226
		case EDebugServModifyBreak:
hgs
parents:
diff changeset
   227
			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServModifyBreak\n" );
hgs
parents:
diff changeset
   228
			ModifyBreakL(aMessage);
hgs
parents:
diff changeset
   229
			break;
hgs
parents:
diff changeset
   230
hgs
parents:
diff changeset
   231
		case EDebugServModifyProcessBreak:
hgs
parents:
diff changeset
   232
			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServModifyProcessBreak\n" );
hgs
parents:
diff changeset
   233
			ModifyProcessBreakL(aMessage);
hgs
parents:
diff changeset
   234
			break;
hgs
parents:
diff changeset
   235
hgs
parents:
diff changeset
   236
		case EDebugServBreakInfo:
hgs
parents:
diff changeset
   237
			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServBreakInfo\n" );
hgs
parents:
diff changeset
   238
			BreakInfoL(aMessage);
hgs
parents:
diff changeset
   239
			break;
hgs
parents:
diff changeset
   240
hgs
parents:
diff changeset
   241
		case EDebugServReadRegisters:
hgs
parents:
diff changeset
   242
			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServReadRegisters\n" );
hgs
parents:
diff changeset
   243
			ReadRegistersL(aMessage);
hgs
parents:
diff changeset
   244
			break;
hgs
parents:
diff changeset
   245
hgs
parents:
diff changeset
   246
		case EDebugServWriteRegisters:
hgs
parents:
diff changeset
   247
			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServWriteRegisters\n" );
hgs
parents:
diff changeset
   248
			WriteRegistersL(aMessage);
hgs
parents:
diff changeset
   249
			break;
hgs
parents:
diff changeset
   250
hgs
parents:
diff changeset
   251
		case EDebugServGetEvent:
hgs
parents:
diff changeset
   252
			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServGetEvent\n" );
hgs
parents:
diff changeset
   253
			GetEventL(aMessage);
hgs
parents:
diff changeset
   254
			break;
hgs
parents:
diff changeset
   255
hgs
parents:
diff changeset
   256
		case EDebugServCancelGetEvent:
hgs
parents:
diff changeset
   257
			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServCancelGetEvent\n" );
hgs
parents:
diff changeset
   258
			CancelGetEventL(aMessage);
hgs
parents:
diff changeset
   259
			break;
hgs
parents:
diff changeset
   260
hgs
parents:
diff changeset
   261
		case EDebugServAttachExecutable:
hgs
parents:
diff changeset
   262
			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServAttachExecutable\n" );
hgs
parents:
diff changeset
   263
			AttachProcessL(aMessage);
hgs
parents:
diff changeset
   264
			break;
hgs
parents:
diff changeset
   265
hgs
parents:
diff changeset
   266
		case EDebugServDetachExecutable:
hgs
parents:
diff changeset
   267
			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServDetachExecutable\n" );
hgs
parents:
diff changeset
   268
			DetachProcessL(aMessage);
hgs
parents:
diff changeset
   269
			break;
hgs
parents:
diff changeset
   270
hgs
parents:
diff changeset
   271
		case EDebugServAttachAll:
hgs
parents:
diff changeset
   272
			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServAttachAll\n" );
hgs
parents:
diff changeset
   273
			AttachAllL(aMessage);
hgs
parents:
diff changeset
   274
			break;
hgs
parents:
diff changeset
   275
hgs
parents:
diff changeset
   276
		case EDebugServDetachAll:
hgs
parents:
diff changeset
   277
			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServDetachAll\n" );
hgs
parents:
diff changeset
   278
			DetachAllL(aMessage);
hgs
parents:
diff changeset
   279
			break;			
hgs
parents:
diff changeset
   280
			
hgs
parents:
diff changeset
   281
		case EDebugServGetDebugFunctionalityBufSize:
hgs
parents:
diff changeset
   282
			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServGetDebugFunctionalityBufSize\n" );
hgs
parents:
diff changeset
   283
			GetDebugFunctionalityBufSizeL(aMessage);
hgs
parents:
diff changeset
   284
			break;
hgs
parents:
diff changeset
   285
hgs
parents:
diff changeset
   286
		case EDebugServGetDebugFunctionality:
hgs
parents:
diff changeset
   287
			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServGetDebugFunctionality\n" );
hgs
parents:
diff changeset
   288
			GetDebugFunctionalityL(aMessage);
hgs
parents:
diff changeset
   289
			break;
hgs
parents:
diff changeset
   290
hgs
parents:
diff changeset
   291
		case EDebugServSetEventAction:
hgs
parents:
diff changeset
   292
			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServSetEventAction\n" );
hgs
parents:
diff changeset
   293
			SetEventActionL(aMessage);
hgs
parents:
diff changeset
   294
			break;
hgs
parents:
diff changeset
   295
hgs
parents:
diff changeset
   296
		case EDebugServGetList:
hgs
parents:
diff changeset
   297
			LOG_MSG( "CSecuritySvrSession::ServiceL() EDebugServGetList\n" );
hgs
parents:
diff changeset
   298
			GetListL(aMessage);
hgs
parents:
diff changeset
   299
			break;
hgs
parents:
diff changeset
   300
hgs
parents:
diff changeset
   301
		case EDebugServStep:
hgs
parents:
diff changeset
   302
			LOG_MSG("CSecuritySvrSession::ServiceL() EDebugServStep\n");
hgs
parents:
diff changeset
   303
			StepL(aMessage);
hgs
parents:
diff changeset
   304
			break;
hgs
parents:
diff changeset
   305
hgs
parents:
diff changeset
   306
		case EDebugServSetProcessBreak:
hgs
parents:
diff changeset
   307
			LOG_MSG("CSecuritySvrSession::ServiceL() EDebugServSetProcessBreak\n");
hgs
parents:
diff changeset
   308
			SetProcessBreakL(aMessage);
hgs
parents:
diff changeset
   309
			break;
hgs
parents:
diff changeset
   310
		
hgs
parents:
diff changeset
   311
		case EDebugServProcessBreakInfo:
hgs
parents:
diff changeset
   312
			LOG_MSG("CSecuritySvrSession::ServiceL() EDebugServProcessBreakInfo\n");
hgs
parents:
diff changeset
   313
			ProcessBreakInfoL(aMessage);
hgs
parents:
diff changeset
   314
			break;
hgs
parents:
diff changeset
   315
hgs
parents:
diff changeset
   316
		case EDebugServKillProcess:
hgs
parents:
diff changeset
   317
			LOG_MSG("CSecuritySvrSession::ServiceL() EDebugServKillProcess\n");
hgs
parents:
diff changeset
   318
			KillProcessL(aMessage);
hgs
parents:
diff changeset
   319
			break;
hgs
parents:
diff changeset
   320
hgs
parents:
diff changeset
   321
#ifdef _DEBUG
hgs
parents:
diff changeset
   322
		case EDebugServMarkHeap:
hgs
parents:
diff changeset
   323
			LOG_MSG("CSecuritySvrSession::ServiceL() EDebugServMarkHeap\n");
hgs
parents:
diff changeset
   324
			// all taken care of in HeapWatcher
hgs
parents:
diff changeset
   325
			aMessage.Complete(KErrNone);
hgs
parents:
diff changeset
   326
			break;
hgs
parents:
diff changeset
   327
hgs
parents:
diff changeset
   328
		case EDebugServMarkEnd:
hgs
parents:
diff changeset
   329
			LOG_MSG("CSecuritySvrSession::ServiceL() EDebugServMarkEnd\n");
hgs
parents:
diff changeset
   330
			// all taken care of in HeapWatcher
hgs
parents:
diff changeset
   331
			aMessage.Complete(KErrNone);
hgs
parents:
diff changeset
   332
			break;
hgs
parents:
diff changeset
   333
hgs
parents:
diff changeset
   334
		case EDebugServFailAlloc:
hgs
parents:
diff changeset
   335
			LOG_MSG("CSecuritySvrSession::ServiceL() EDebugServFailAlloc\n");
hgs
parents:
diff changeset
   336
			DoFailAlloc(aMessage);
hgs
parents:
diff changeset
   337
			break;
hgs
parents:
diff changeset
   338
#endif
hgs
parents:
diff changeset
   339
		case EDebugServReadCrashFlash:
hgs
parents:
diff changeset
   340
			ReadCrashLogL(aMessage);
hgs
parents:
diff changeset
   341
			break;		
hgs
parents:
diff changeset
   342
		case EDebugServWriteCrashFlash:
hgs
parents:
diff changeset
   343
			LOG_MSG("CSecuritySvrSession::ServiceL() EDebugServWriteCrashFlash\n");
hgs
parents:
diff changeset
   344
			WriteCrashConfigL(aMessage);
hgs
parents:
diff changeset
   345
			break;
hgs
parents:
diff changeset
   346
		case EDebugServEraseCrashFlash:
hgs
parents:
diff changeset
   347
			LOG_MSG("CSecuritySvrSession::ServiceL() EDebugServEraseCrashFlash\n");
hgs
parents:
diff changeset
   348
			EraseCrashLogL(aMessage);
hgs
parents:
diff changeset
   349
			break;
hgs
parents:
diff changeset
   350
		case EDebugServEraseEntireCrashFlash:
hgs
parents:
diff changeset
   351
			LOG_MSG("CSecuritySvrSession::ServiceL() EDebugServEraseEntireCrashFlash\n");
hgs
parents:
diff changeset
   352
			EraseEntireCrashLogL(aMessage);
hgs
parents:
diff changeset
   353
			break;
hgs
parents:
diff changeset
   354
		default:
hgs
parents:
diff changeset
   355
			LOG_MSG( "CSecuritySvrSession::ServiceL() Unknown request, calling User::Leave(KErrNotSupported);\n" );
hgs
parents:
diff changeset
   356
			User::Leave(KErrNotSupported);
hgs
parents:
diff changeset
   357
			break;
hgs
parents:
diff changeset
   358
		}
hgs
parents:
diff changeset
   359
hgs
parents:
diff changeset
   360
	//insert ending heap markers
hgs
parents:
diff changeset
   361
	HeapWatcher(aMessage.Function(), EFalse);
hgs
parents:
diff changeset
   362
	
hgs
parents:
diff changeset
   363
	LOG_EXIT();
hgs
parents:
diff changeset
   364
	}
hgs
parents:
diff changeset
   365
hgs
parents:
diff changeset
   366
#ifdef _DEBUG
hgs
parents:
diff changeset
   367
/**
hgs
parents:
diff changeset
   368
  Used to control heap failure in debug mode.
hgs
parents:
diff changeset
   369
  @param aMessage If aMessage.Int0 is non-zero then heap will be set to fail on that allocation.
hgs
parents:
diff changeset
   370
  If aMessage.Int0 is zero then the heap failure count is reset
hgs
parents:
diff changeset
   371
  */
hgs
parents:
diff changeset
   372
void CSecuritySvrSession::DoFailAlloc(const RMessage2& aMessage)
hgs
parents:
diff changeset
   373
	{
hgs
parents:
diff changeset
   374
	TInt count = aMessage.Int0();
hgs
parents:
diff changeset
   375
	if(count == 0)
hgs
parents:
diff changeset
   376
		{
hgs
parents:
diff changeset
   377
		__UHEAP_RESET;
hgs
parents:
diff changeset
   378
		}
hgs
parents:
diff changeset
   379
	else
hgs
parents:
diff changeset
   380
		{
hgs
parents:
diff changeset
   381
		__UHEAP_FAILNEXT(count);
hgs
parents:
diff changeset
   382
		}
hgs
parents:
diff changeset
   383
	aMessage.Complete(KErrNone);
hgs
parents:
diff changeset
   384
	}
hgs
parents:
diff changeset
   385
#endif
hgs
parents:
diff changeset
   386
hgs
parents:
diff changeset
   387
/**
hgs
parents:
diff changeset
   388
Suspends execution of the specified thread.
hgs
parents:
diff changeset
   389
hgs
parents:
diff changeset
   390
@param aMessage contains an integer representation of the target thread's
hgs
parents:
diff changeset
   391
       thread ID at offset 0.
hgs
parents:
diff changeset
   392
hgs
parents:
diff changeset
   393
@leave KErrPermissionDenied if security check fails or KErrArgument if the
hgs
parents:
diff changeset
   394
       thread does not exist
hgs
parents:
diff changeset
   395
*/
hgs
parents:
diff changeset
   396
void CSecuritySvrSession::SuspendThreadL(const RMessage2& aMessage)
hgs
parents:
diff changeset
   397
	{
hgs
parents:
diff changeset
   398
hgs
parents:
diff changeset
   399
	LOG_MSG( "CSecuritySvrSession::SuspendThreadL()\n" );
hgs
parents:
diff changeset
   400
hgs
parents:
diff changeset
   401
	//get thread ID
hgs
parents:
diff changeset
   402
	TThreadId threadId = ReadTThreadIdL(aMessage, 0);
hgs
parents:
diff changeset
   403
	//check attached
hgs
parents:
diff changeset
   404
	CheckAttachedL(threadId, aMessage, EFalse);
hgs
parents:
diff changeset
   405
hgs
parents:
diff changeset
   406
	//security check passed so can perform actions
hgs
parents:
diff changeset
   407
	User::LeaveIfError(Server().iKernelDriver.SuspendThread(threadId));
hgs
parents:
diff changeset
   408
hgs
parents:
diff changeset
   409
	aMessage.Complete(KErrNone);
hgs
parents:
diff changeset
   410
	}
hgs
parents:
diff changeset
   411
hgs
parents:
diff changeset
   412
/**
hgs
parents:
diff changeset
   413
Resumes execution of the specified thread.
hgs
parents:
diff changeset
   414
hgs
parents:
diff changeset
   415
@param aMessage contains an integer representation of the target thread's
hgs
parents:
diff changeset
   416
       thread ID at offset 0.
hgs
parents:
diff changeset
   417
hgs
parents:
diff changeset
   418
@leave KErrPermissionDenied if security check fails or KErrArgument if the
hgs
parents:
diff changeset
   419
       thread does not exist
hgs
parents:
diff changeset
   420
*/
hgs
parents:
diff changeset
   421
void CSecuritySvrSession::ResumeThreadL(const RMessage2& aMessage)
hgs
parents:
diff changeset
   422
	{
hgs
parents:
diff changeset
   423
	LOG_MSG( "CSecuritySvrSession::ResumeThreadL()\n" );
hgs
parents:
diff changeset
   424
hgs
parents:
diff changeset
   425
	//get thread ID
hgs
parents:
diff changeset
   426
	TThreadId threadId = ReadTThreadIdL(aMessage, 0);
hgs
parents:
diff changeset
   427
hgs
parents:
diff changeset
   428
	//check attached
hgs
parents:
diff changeset
   429
	CheckAttachedL(threadId, aMessage, EFalse);
hgs
parents:
diff changeset
   430
	
hgs
parents:
diff changeset
   431
	//security check passed so can perform actions
hgs
parents:
diff changeset
   432
	TInt err = Server().iKernelDriver.ResumeThread(threadId);
hgs
parents:
diff changeset
   433
	aMessage.Complete(err);
hgs
parents:
diff changeset
   434
	}
hgs
parents:
diff changeset
   435
hgs
parents:
diff changeset
   436
void CSecuritySvrSession::GetDebugFunctionalityBufSizeL(const RMessage2& aMessage)
hgs
parents:
diff changeset
   437
//
hgs
parents:
diff changeset
   438
// Retrieve size of functionality data buffer in bytes which must be allocated
hgs
parents:
diff changeset
   439
// by the client
hgs
parents:
diff changeset
   440
//
hgs
parents:
diff changeset
   441
	{
hgs
parents:
diff changeset
   442
	LOG_MSG( "CSecuritySvrSession::GetDebugFunctionalityBufSizeL()\n" );
hgs
parents:
diff changeset
   443
hgs
parents:
diff changeset
   444
	TUint32 result = 0;
hgs
parents:
diff changeset
   445
	// Get Buffer size from the kernel driver
hgs
parents:
diff changeset
   446
	User::LeaveIfError(Server().iKernelDriver.GetDebugFunctionalityBufSize(result));
hgs
parents:
diff changeset
   447
hgs
parents:
diff changeset
   448
	TPtr8 stuff((TUint8*)&result,4, 4);
hgs
parents:
diff changeset
   449
hgs
parents:
diff changeset
   450
	aMessage.WriteL(0,stuff);
hgs
parents:
diff changeset
   451
hgs
parents:
diff changeset
   452
	aMessage.Complete(KErrNone);
hgs
parents:
diff changeset
   453
	}
hgs
parents:
diff changeset
   454
hgs
parents:
diff changeset
   455
void CSecuritySvrSession::GetDebugFunctionalityL(const RMessage2& aMessage)
hgs
parents:
diff changeset
   456
//
hgs
parents:
diff changeset
   457
// Retrieve the functionality data and place it in a buffer
hgs
parents:
diff changeset
   458
// allocated by the client.
hgs
parents:
diff changeset
   459
//
hgs
parents:
diff changeset
   460
	{
hgs
parents:
diff changeset
   461
	LOG_MSG( "CSecuritySvrSession::GetDebugFunctionalityL()\n" );
hgs
parents:
diff changeset
   462
hgs
parents:
diff changeset
   463
	TUint32 dfsize = 0;
hgs
parents:
diff changeset
   464
hgs
parents:
diff changeset
   465
	// Get Buffer size from the kernel driver
hgs
parents:
diff changeset
   466
	User::LeaveIfError(Server().iKernelDriver.GetDebugFunctionalityBufSize(dfsize));
hgs
parents:
diff changeset
   467
hgs
parents:
diff changeset
   468
	// Allocate space for the functionality data
hgs
parents:
diff changeset
   469
	HBufC8* dftext = HBufC8::NewLC(dfsize);
hgs
parents:
diff changeset
   470
hgs
parents:
diff changeset
   471
	const TPtr8& dfPtr = dftext->Des();
hgs
parents:
diff changeset
   472
hgs
parents:
diff changeset
   473
	// Extract said data from the device driver
hgs
parents:
diff changeset
   474
	User::LeaveIfError(Server().iKernelDriver.GetDebugFunctionality((TDes8&)dfPtr));
hgs
parents:
diff changeset
   475
hgs
parents:
diff changeset
   476
	// Return data to client
hgs
parents:
diff changeset
   477
	aMessage.WriteL(0,dfPtr);
hgs
parents:
diff changeset
   478
hgs
parents:
diff changeset
   479
	// Free buffer
hgs
parents:
diff changeset
   480
	CleanupStack::PopAndDestroy(dftext);
hgs
parents:
diff changeset
   481
hgs
parents:
diff changeset
   482
	aMessage.Complete(KErrNone);
hgs
parents:
diff changeset
   483
	}
hgs
parents:
diff changeset
   484
hgs
parents:
diff changeset
   485
/**
hgs
parents:
diff changeset
   486
Reads memory from a specified thread using the passed parameters. The user 
hgs
parents:
diff changeset
   487
should ensure that the TPtr8 that is passed in has size greater than or equal
hgs
parents:
diff changeset
   488
to the size of the memory that is trying to be read.
hgs
parents:
diff changeset
   489
hgs
parents:
diff changeset
   490
@param aMessage The RMessage2 object should be constructed as follows:
hgs
parents:
diff changeset
   491
    * aMessage.Int0() is the thread ID of the target debug app
hgs
parents:
diff changeset
   492
    * aMessage.Ptr1() is a TMemoryInfo object which contains the following:
hgs
parents:
diff changeset
   493
        * the address of the memory to be read from the target debug thread
hgs
parents:
diff changeset
   494
        * the size of the memory block to be read from the target debug thread
hgs
parents:
diff changeset
   495
	* the access size to use
hgs
parents:
diff changeset
   496
	* the endianess to interpret the data as
hgs
parents:
diff changeset
   497
    * aMessage.Ptr2() is the address of the buffer in the debug agent thread 
hgs
parents:
diff changeset
   498
      that the data from the target debug app should be written into 
hgs
parents:
diff changeset
   499
hgs
parents:
diff changeset
   500
@leave KErrPermissionDenied if client is not attached to the target
hgs
parents:
diff changeset
   501
       thread's process,
hgs
parents:
diff changeset
   502
       KErrNoMemory if memory could not be allocated,
hgs
parents:
diff changeset
   503
       KErrArgument if there are problems with the aMessage object,
hgs
parents:
diff changeset
   504
       KErrBadHandle if the thread represented by aMessage.Ptr0() is invalid,
hgs
parents:
diff changeset
   505
       an error value from CSecuritySvrSession::ValidateMemoryInfo if checking
hgs
parents:
diff changeset
   506
       the memory attributes failed,
hgs
parents:
diff changeset
   507
       or another of the system wide error codes
hgs
parents:
diff changeset
   508
*/
hgs
parents:
diff changeset
   509
void CSecuritySvrSession::ReadMemoryL(const RMessage2& aMessage)
hgs
parents:
diff changeset
   510
	{
hgs
parents:
diff changeset
   511
	LOG_MSG( "CSecuritySvrSession::ReadMemoryL()\n" );
hgs
parents:
diff changeset
   512
hgs
parents:
diff changeset
   513
	//get debug app thread ID
hgs
parents:
diff changeset
   514
	TThreadId threadId = ReadTThreadIdL(aMessage, 0);
hgs
parents:
diff changeset
   515
hgs
parents:
diff changeset
   516
	CheckAttachedL(threadId, aMessage, ETrue);
hgs
parents:
diff changeset
   517
hgs
parents:
diff changeset
   518
	//create and initialise the memory info object
hgs
parents:
diff changeset
   519
	TMemoryInfo targetMemory;
hgs
parents:
diff changeset
   520
	TPtr8 targetMemoryPtr( (TUint8 *)&targetMemory, sizeof(TMemoryInfo) );
hgs
parents:
diff changeset
   521
hgs
parents:
diff changeset
   522
	aMessage.ReadL(1,targetMemoryPtr);
hgs
parents:
diff changeset
   523
hgs
parents:
diff changeset
   524
	//check memory info is acceptable
hgs
parents:
diff changeset
   525
	ValidateMemoryInfoL(threadId, targetMemory, ETrue);
hgs
parents:
diff changeset
   526
hgs
parents:
diff changeset
   527
	RBuf8 data;
hgs
parents:
diff changeset
   528
	data.CreateL(targetMemory.iSize);
hgs
parents:
diff changeset
   529
	data.CleanupClosePushL();
hgs
parents:
diff changeset
   530
hgs
parents:
diff changeset
   531
	//fill buffer with data from target debug thread
hgs
parents:
diff changeset
   532
	User::LeaveIfError(Server().iKernelDriver.ReadMemory(threadId, targetMemory.iAddress, targetMemory.iSize, data));
hgs
parents:
diff changeset
   533
hgs
parents:
diff changeset
   534
	//attempt to write the data from the target debug thread back to the agent
hgs
parents:
diff changeset
   535
	aMessage.WriteL(2, data);
hgs
parents:
diff changeset
   536
hgs
parents:
diff changeset
   537
	//delete temporary buffer
hgs
parents:
diff changeset
   538
	CleanupStack::PopAndDestroy(&data);
hgs
parents:
diff changeset
   539
hgs
parents:
diff changeset
   540
	aMessage.Complete(KErrNone);
hgs
parents:
diff changeset
   541
	}
hgs
parents:
diff changeset
   542
hgs
parents:
diff changeset
   543
/**
hgs
parents:
diff changeset
   544
Writes memory to a specified thread using the passed parameters. 
hgs
parents:
diff changeset
   545
hgs
parents:
diff changeset
   546
@param aMessage The RMessage2 object should be constructed as follows:
hgs
parents:
diff changeset
   547
    * aMessage.Ptr0() is the thread ID of the target debug app
hgs
parents:
diff changeset
   548
    * aMessage.Ptr1() is a TMemoryInfo object which contains the following:
hgs
parents:
diff changeset
   549
        * the address of the memory to be written to the target debug thread
hgs
parents:
diff changeset
   550
        * the size of the memory block to be written to the target debug thread
hgs
parents:
diff changeset
   551
	* the access size to use
hgs
parents:
diff changeset
   552
	* the endianess to interpret the data as
hgs
parents:
diff changeset
   553
    * aMessage.Ptr2() is the address of the buffer in the debug agent thread 
hgs
parents:
diff changeset
   554
      that the data to write to the target debug app should be read from
hgs
parents:
diff changeset
   555
hgs
parents:
diff changeset
   556
@leave KErrPermissionDenied if client is not attached (actively) to the target
hgs
parents:
diff changeset
   557
       thread's process,
hgs
parents:
diff changeset
   558
       KErrNoMemory if memory could not be allocated,
hgs
parents:
diff changeset
   559
       KErrArgument if there are problems with the aMessage object,
hgs
parents:
diff changeset
   560
       KErrBadHandle if the thread represented by aMessage.Ptr0() is invalid,
hgs
parents:
diff changeset
   561
       an error value from CSecuritySvrSession::ValidateMemoryInfo if checking
hgs
parents:
diff changeset
   562
       the memory attributes failed,
hgs
parents:
diff changeset
   563
       or another of the system wide error codes
hgs
parents:
diff changeset
   564
*/
hgs
parents:
diff changeset
   565
void CSecuritySvrSession::WriteMemoryL(const RMessage2& aMessage)
hgs
parents:
diff changeset
   566
	{
hgs
parents:
diff changeset
   567
	LOG_MSG( "CSecuritySvrSession::WriteMemoryL()\n" );
hgs
parents:
diff changeset
   568
hgs
parents:
diff changeset
   569
	//get debug app thread ID
hgs
parents:
diff changeset
   570
	TThreadId threadId = ReadTThreadIdL(aMessage, 0);
hgs
parents:
diff changeset
   571
hgs
parents:
diff changeset
   572
	CheckAttachedL(threadId, aMessage, EFalse);
hgs
parents:
diff changeset
   573
hgs
parents:
diff changeset
   574
	//create and initialise the memory info object
hgs
parents:
diff changeset
   575
	TMemoryInfo targetMemory;
hgs
parents:
diff changeset
   576
	TPtr8 targetMemoryPtr( (TUint8 *)&targetMemory, sizeof(TMemoryInfo) );
hgs
parents:
diff changeset
   577
hgs
parents:
diff changeset
   578
	aMessage.ReadL(1,targetMemoryPtr);
hgs
parents:
diff changeset
   579
hgs
parents:
diff changeset
   580
	//check memory info is acceptable
hgs
parents:
diff changeset
   581
	ValidateMemoryInfoL(threadId, targetMemory, EFalse);
hgs
parents:
diff changeset
   582
hgs
parents:
diff changeset
   583
	//create temporary buffer and read data from client
hgs
parents:
diff changeset
   584
	RBuf8 data;
hgs
parents:
diff changeset
   585
	data.CreateL(targetMemory.iSize);
hgs
parents:
diff changeset
   586
	data.CleanupClosePushL();
hgs
parents:
diff changeset
   587
	
hgs
parents:
diff changeset
   588
	aMessage.ReadL(2, data);
hgs
parents:
diff changeset
   589
hgs
parents:
diff changeset
   590
	// what about telling the driver about endianess/access size?
hgs
parents:
diff changeset
   591
	User::LeaveIfError(Server().iKernelDriver.WriteMemory(threadId, targetMemory.iAddress, targetMemory.iSize, data));
hgs
parents:
diff changeset
   592
hgs
parents:
diff changeset
   593
	//free temporary buffer
hgs
parents:
diff changeset
   594
	CleanupStack::PopAndDestroy(&data);
hgs
parents:
diff changeset
   595
hgs
parents:
diff changeset
   596
	aMessage.Complete(KErrNone);
hgs
parents:
diff changeset
   597
	}
hgs
parents:
diff changeset
   598
hgs
parents:
diff changeset
   599
/**
hgs
parents:
diff changeset
   600
@internalTechnology
hgs
parents:
diff changeset
   601
hgs
parents:
diff changeset
   602
Notes: This call is used to set a thread specific breakpoint. Its input arguments
hgs
parents:
diff changeset
   603
are the thread id, address and architecture type of the breakpoint. It returns success
hgs
parents:
diff changeset
   604
or failure, and if successful, it sets the TBreakId in the Debug Agent to the 
hgs
parents:
diff changeset
   605
breakpoint id by which it can be referenced in future calls to ModifyBreak,ClearBreak and
hgs
parents:
diff changeset
   606
BreakInfo.
hgs
parents:
diff changeset
   607
hgs
parents:
diff changeset
   608
@param aMessage.Ptr0() - aThreadId is thread id of the target debug process
hgs
parents:
diff changeset
   609
@param aMessage.Ptr1() - Address of a TBreakInfo in the Debug Agent
hgs
parents:
diff changeset
   610
@param aMessage.Ptr2() - Address of a TBreakId in the Debug Agent
hgs
parents:
diff changeset
   611
@leave KErrPermissionDenied if the security check fails.
hgs
parents:
diff changeset
   612
 KErrAlreadyExists if there is a breakpoint overlapping the desired address.
hgs
parents:
diff changeset
   613
 KErrNotSupported if the architecture type is unrecognised.
hgs
parents:
diff changeset
   614
 KErrNoMemory if there is no more memory to complete the operation.
hgs
parents:
diff changeset
   615
 KErrArgument if the breakpoint address alignment is unsuitable for the requested
hgs
parents:
diff changeset
   616
 breakpoint.
hgs
parents:
diff changeset
   617
 KErrOverflow if there are too many breakpoints set.
hgs
parents:
diff changeset
   618
*/
hgs
parents:
diff changeset
   619
void CSecuritySvrSession::SetBreakL(const RMessage2& aMessage)
hgs
parents:
diff changeset
   620
	{
hgs
parents:
diff changeset
   621
	LOG_MSG( "CSecuritySvrSession::SetBreakL!()\n" );
hgs
parents:
diff changeset
   622
hgs
parents:
diff changeset
   623
	//get debug app thread ID
hgs
parents:
diff changeset
   624
	TThreadId threadId = ReadTThreadIdL(aMessage, 0);
hgs
parents:
diff changeset
   625
hgs
parents:
diff changeset
   626
	//check that the agent has attached to the target process
hgs
parents:
diff changeset
   627
	CheckAttachedL(threadId, aMessage, EFalse);
hgs
parents:
diff changeset
   628
hgs
parents:
diff changeset
   629
	//create and initialise the break info object
hgs
parents:
diff changeset
   630
	TBreakInfo breakInfo;
hgs
parents:
diff changeset
   631
	TPtr8 breakInfoPtr( (TUint8 *)&breakInfo, sizeof(TBreakInfo) );
hgs
parents:
diff changeset
   632
hgs
parents:
diff changeset
   633
	aMessage.ReadL(1,breakInfoPtr);
hgs
parents:
diff changeset
   634
hgs
parents:
diff changeset
   635
	LOG_MSG4( "CSecuritySvrSession::SetBreakL, threadId=0x%lx, addr=0x%x, mode=%d", 
hgs
parents:
diff changeset
   636
			threadId.Id(), breakInfo.iAddress, breakInfo.iArchitectureMode);
hgs
parents:
diff changeset
   637
			
hgs
parents:
diff changeset
   638
	//set break in target app
hgs
parents:
diff changeset
   639
	TBreakId breakId = 0;
hgs
parents:
diff changeset
   640
	User::LeaveIfError(Server().iKernelDriver.SetBreak(breakId, threadId, breakInfo.iAddress, breakInfo.iArchitectureMode));
hgs
parents:
diff changeset
   641
hgs
parents:
diff changeset
   642
	//attempt to write the break id back to the debug agent
hgs
parents:
diff changeset
   643
	WriteDataL(aMessage, 2, &breakId, sizeof(breakId));
hgs
parents:
diff changeset
   644
hgs
parents:
diff changeset
   645
	aMessage.Complete(KErrNone);
hgs
parents:
diff changeset
   646
	}
hgs
parents:
diff changeset
   647
hgs
parents:
diff changeset
   648
/**
hgs
parents:
diff changeset
   649
Clears a breakpoint previously set by a SetBreak() call.
hgs
parents:
diff changeset
   650
hgs
parents:
diff changeset
   651
@param aMessage.Int0() - TBreakId of the breakpoint to be removed.
hgs
parents:
diff changeset
   652
*/
hgs
parents:
diff changeset
   653
void CSecuritySvrSession::ClearBreakL(const RMessage2& aMessage)
hgs
parents:
diff changeset
   654
	{
hgs
parents:
diff changeset
   655
	LOG_MSG( "CSecuritySvrSession::ClearBreakL()\n" );
hgs
parents:
diff changeset
   656
hgs
parents:
diff changeset
   657
	const TInt breakId = aMessage.Int0();
hgs
parents:
diff changeset
   658
hgs
parents:
diff changeset
   659
	// Check that the breakpoint exists
hgs
parents:
diff changeset
   660
	TUint64 objectId;
hgs
parents:
diff changeset
   661
	TUint32 address;
hgs
parents:
diff changeset
   662
	TArchitectureMode mode;
hgs
parents:
diff changeset
   663
	TBool threadSpecific = EFalse;
hgs
parents:
diff changeset
   664
hgs
parents:
diff changeset
   665
	User::LeaveIfError(Server().iKernelDriver.BreakInfo(breakId,objectId,address,mode,threadSpecific));
hgs
parents:
diff changeset
   666
hgs
parents:
diff changeset
   667
	if(threadSpecific)
hgs
parents:
diff changeset
   668
		{
hgs
parents:
diff changeset
   669
		// Check that the debug agent is attached to the thread for which the
hgs
parents:
diff changeset
   670
		// breakpoint is currently set.
hgs
parents:
diff changeset
   671
		LOG_MSG4( "CSecuritySvrSession::ClearBreakL( brkId=%d), addr=0x%x, tId=0x%x", 
hgs
parents:
diff changeset
   672
			breakId, address, I64LOW(objectId) );		
hgs
parents:
diff changeset
   673
		CheckAttachedL(TThreadId(objectId), aMessage, EFalse);		
hgs
parents:
diff changeset
   674
		}
hgs
parents:
diff changeset
   675
	else
hgs
parents:
diff changeset
   676
		{
hgs
parents:
diff changeset
   677
		// Check that the debug agent is attached to the process for which the
hgs
parents:
diff changeset
   678
		// breakpoint is currently set.
hgs
parents:
diff changeset
   679
		LOG_MSG4( "CSecuritySvrSession::ClearBreakL( brkId=%d), addr=0x%x, pId=0x%x", 
hgs
parents:
diff changeset
   680
			breakId, address, I64LOW(objectId) );		
hgs
parents:
diff changeset
   681
		CheckAttachedL(TProcessId(objectId), aMessage, EFalse);
hgs
parents:
diff changeset
   682
		}
hgs
parents:
diff changeset
   683
hgs
parents:
diff changeset
   684
	// Finally clear the breakpoint
hgs
parents:
diff changeset
   685
	User::LeaveIfError(Server().iKernelDriver.ClearBreak(breakId));
hgs
parents:
diff changeset
   686
hgs
parents:
diff changeset
   687
	aMessage.Complete(KErrNone);
hgs
parents:
diff changeset
   688
	}
hgs
parents:
diff changeset
   689
hgs
parents:
diff changeset
   690
/**
hgs
parents:
diff changeset
   691
@param aMessage.Int0() - Breakpoint Id of interest
hgs
parents:
diff changeset
   692
@param aMessage.Ptr1() - Address in Debug Agent to place threadId of the breakpoint
hgs
parents:
diff changeset
   693
@param aMessage.Ptr2() - Address in Debug Agent to place address of the breakpoint
hgs
parents:
diff changeset
   694
@param aMessage.Ptr3() - Address in Debug Agent to place the architecture mode of the breakpoint
hgs
parents:
diff changeset
   695
@leave Any error which may be returned by RSessionBase::SendReceive()
hgs
parents:
diff changeset
   696
*/
hgs
parents:
diff changeset
   697
void CSecuritySvrSession::BreakInfoL(const RMessage2& aMessage)
hgs
parents:
diff changeset
   698
	{
hgs
parents:
diff changeset
   699
	const TBreakId breakId = (TBreakId)aMessage.Int0();
hgs
parents:
diff changeset
   700
hgs
parents:
diff changeset
   701
	TThreadId threadId;
hgs
parents:
diff changeset
   702
	TUint32 address;
hgs
parents:
diff changeset
   703
	TArchitectureMode mode;
hgs
parents:
diff changeset
   704
	TBool threadSpecific = ETrue;
hgs
parents:
diff changeset
   705
hgs
parents:
diff changeset
   706
	TUint64 threadIdData;
hgs
parents:
diff changeset
   707
	User::LeaveIfError(Server().iKernelDriver.BreakInfo(breakId,threadIdData,address,mode,threadSpecific));
hgs
parents:
diff changeset
   708
hgs
parents:
diff changeset
   709
	if(!threadSpecific)
hgs
parents:
diff changeset
   710
		{
hgs
parents:
diff changeset
   711
		User::Leave(KErrNotFound);
hgs
parents:
diff changeset
   712
		}
hgs
parents:
diff changeset
   713
hgs
parents:
diff changeset
   714
	threadId = TThreadId(threadIdData);
hgs
parents:
diff changeset
   715
hgs
parents:
diff changeset
   716
	//check that the agent has attached to the target process
hgs
parents:
diff changeset
   717
	CheckAttachedL(threadId, aMessage, EFalse);
hgs
parents:
diff changeset
   718
hgs
parents:
diff changeset
   719
	// return the threadId
hgs
parents:
diff changeset
   720
	WriteDataL(aMessage, 1, &threadId, sizeof(threadId));
hgs
parents:
diff changeset
   721
hgs
parents:
diff changeset
   722
	// return the address
hgs
parents:
diff changeset
   723
	WriteDataL(aMessage, 2, &address, sizeof(address));
hgs
parents:
diff changeset
   724
hgs
parents:
diff changeset
   725
	// return the mode
hgs
parents:
diff changeset
   726
	WriteDataL(aMessage, 3, &mode, sizeof(mode));
hgs
parents:
diff changeset
   727
hgs
parents:
diff changeset
   728
	aMessage.Complete(KErrNone);
hgs
parents:
diff changeset
   729
	}
hgs
parents:
diff changeset
   730
hgs
parents:
diff changeset
   731
/**
hgs
parents:
diff changeset
   732
@internalTechnology
hgs
parents:
diff changeset
   733
hgs
parents:
diff changeset
   734
Modify a previously set breakpoint.
hgs
parents:
diff changeset
   735
hgs
parents:
diff changeset
   736
@param aMessage.Int0() - The breakpoint id of the breakpoint to modify
hgs
parents:
diff changeset
   737
@param aMessage.Ptr1() - The new Thread Id for the breakpoint
hgs
parents:
diff changeset
   738
@param aMessage.Int2() - The new virtual memory address for the breakpoint
hgs
parents:
diff changeset
   739
@param aMessage.Int3() - The new architecture mode for the breakpoint
hgs
parents:
diff changeset
   740
@return KErrNone if succesful. KErrPermissionDenied if the security check fails.
hgs
parents:
diff changeset
   741
 KErrAlreadyExists if there is a breakpoint overlapping the desired address.
hgs
parents:
diff changeset
   742
 KErrNotSupported if the architecture type is unrecognised.
hgs
parents:
diff changeset
   743
 KErrNoMemory if there is no more memory to complete the operation.
hgs
parents:
diff changeset
   744
 KErrArgument if the breakpoint address alignment is unsuitable for the requested
hgs
parents:
diff changeset
   745
 breakpoint.
hgs
parents:
diff changeset
   746
 KErrOverflow if there are too many breakpoints set.
hgs
parents:
diff changeset
   747
*/
hgs
parents:
diff changeset
   748
void CSecuritySvrSession::ModifyBreakL(const RMessage2& aMessage)
hgs
parents:
diff changeset
   749
	{
hgs
parents:
diff changeset
   750
	const TBreakId breakId = (TBreakId)aMessage.Int0();
hgs
parents:
diff changeset
   751
	const TThreadId threadId = ReadTThreadIdL(aMessage, 1);
hgs
parents:
diff changeset
   752
	const TUint32 address = aMessage.Int2();
hgs
parents:
diff changeset
   753
	const TArchitectureMode mode = (TArchitectureMode)aMessage.Int3();
hgs
parents:
diff changeset
   754
hgs
parents:
diff changeset
   755
	// Get information on the breakpoint to check the security status
hgs
parents:
diff changeset
   756
	TUint64 checkThreadId;
hgs
parents:
diff changeset
   757
	TUint32 checkAddress;
hgs
parents:
diff changeset
   758
	TArchitectureMode checkMode;
hgs
parents:
diff changeset
   759
	TBool threadSpecific;
hgs
parents:
diff changeset
   760
hgs
parents:
diff changeset
   761
	User::LeaveIfError(Server().iKernelDriver.BreakInfo(breakId,checkThreadId,checkAddress,checkMode,threadSpecific));
hgs
parents:
diff changeset
   762
hgs
parents:
diff changeset
   763
	LOG_MSG4( "CSecuritySvrSession::ModifyBreakL(brkId=%d) tId=0x%x, addr=0x%x", 
hgs
parents:
diff changeset
   764
			breakId, I64LOW(threadId.Id()), address );
hgs
parents:
diff changeset
   765
			
hgs
parents:
diff changeset
   766
	// Security check that the thread Id is associated with the debug agent
hgs
parents:
diff changeset
   767
hgs
parents:
diff changeset
   768
	//check that the agent has attached to the target process
hgs
parents:
diff changeset
   769
	CheckAttachedL(TThreadId(checkThreadId), aMessage, EFalse);
hgs
parents:
diff changeset
   770
hgs
parents:
diff changeset
   771
	// now check that the thread Id which is being set is permitted
hgs
parents:
diff changeset
   772
	//check that the agent has attached to the target process
hgs
parents:
diff changeset
   773
	CheckAttachedL(threadId, aMessage, EFalse);
hgs
parents:
diff changeset
   774
hgs
parents:
diff changeset
   775
	User::LeaveIfError(Server().iKernelDriver.ModifyBreak(breakId,threadId,address,mode));
hgs
parents:
diff changeset
   776
hgs
parents:
diff changeset
   777
	aMessage.Complete(KErrNone);
hgs
parents:
diff changeset
   778
	}
hgs
parents:
diff changeset
   779
hgs
parents:
diff changeset
   780
/**
hgs
parents:
diff changeset
   781
@internalTechnology
hgs
parents:
diff changeset
   782
hgs
parents:
diff changeset
   783
Notes: This call is used to set a process wide breakpoint. Its input arguments
hgs
parents:
diff changeset
   784
are the process id, address and architecture type of the breakpoint. It returns success
hgs
parents:
diff changeset
   785
or failure, and if successful, it sets the TBreakId in the Debug Agent to the 
hgs
parents:
diff changeset
   786
breakpoint id by which it can be referenced in future calls to ModifyBreak,ClearBreak and
hgs
parents:
diff changeset
   787
BreakInfo.
hgs
parents:
diff changeset
   788
hgs
parents:
diff changeset
   789
@param aMessage.Ptr0() - aProcessId is process id of the target debug process
hgs
parents:
diff changeset
   790
@param aMessage.Ptr1() - Address of a TBreakInfo in the Debug Agent
hgs
parents:
diff changeset
   791
@param aMessage.Ptr2() - Address of a TBreakId in the Debug Agent
hgs
parents:
diff changeset
   792
@leave KErrPermissionDenied if the security check fails.
hgs
parents:
diff changeset
   793
 KErrAlreadyExists if there is a breakpoint overlapping the desired address.
hgs
parents:
diff changeset
   794
 KErrNotSupported if the architecture type is unrecognised.
hgs
parents:
diff changeset
   795
 KErrNoMemory if there is no more memory to complete the operation.
hgs
parents:
diff changeset
   796
 KErrArgument if the breakpoint address alignment is unsuitable for the requested
hgs
parents:
diff changeset
   797
 breakpoint.
hgs
parents:
diff changeset
   798
 KErrOverflow if there are too many breakpoints set.
hgs
parents:
diff changeset
   799
*/
hgs
parents:
diff changeset
   800
void CSecuritySvrSession::SetProcessBreakL(const RMessage2& aMessage)
hgs
parents:
diff changeset
   801
	{
hgs
parents:
diff changeset
   802
	LOG_MSG( "CSecuritySvrSession::SetProcessBreakL()\n" );
hgs
parents:
diff changeset
   803
hgs
parents:
diff changeset
   804
	//get debug app thread ID
hgs
parents:
diff changeset
   805
	TProcessId procId = ReadTProcessIdL(aMessage, 0);
hgs
parents:
diff changeset
   806
hgs
parents:
diff changeset
   807
	//check that the agent has attached to the target process
hgs
parents:
diff changeset
   808
	CheckAttachedL(procId, aMessage, EFalse);
hgs
parents:
diff changeset
   809
hgs
parents:
diff changeset
   810
	//create and initialise the memory info object
hgs
parents:
diff changeset
   811
	TBreakInfo breakInfo;
hgs
parents:
diff changeset
   812
	TPtr8 breakInfoPtr( (TUint8 *)&breakInfo, sizeof(TBreakInfo) );
hgs
parents:
diff changeset
   813
hgs
parents:
diff changeset
   814
	aMessage.ReadL(1,breakInfoPtr);
hgs
parents:
diff changeset
   815
hgs
parents:
diff changeset
   816
	LOG_MSG4( "CSecuritySvrSession::SetProcessBreakL pId=0x%x, addr=0x%x, mode=%d ", 
hgs
parents:
diff changeset
   817
			I64LOW(procId.Id()), breakInfo.iAddress, breakInfo.iArchitectureMode );
hgs
parents:
diff changeset
   818
hgs
parents:
diff changeset
   819
	//set break in target app
hgs
parents:
diff changeset
   820
	TBreakId breakId = 0;
hgs
parents:
diff changeset
   821
	User::LeaveIfError(Server().iKernelDriver.SetProcessBreak(breakId, procId, breakInfo.iAddress, breakInfo.iArchitectureMode));
hgs
parents:
diff changeset
   822
hgs
parents:
diff changeset
   823
	//attempt to write the break id back to the debug agent
hgs
parents:
diff changeset
   824
	WriteDataL(aMessage, 2, &breakId, sizeof(breakId));
hgs
parents:
diff changeset
   825
hgs
parents:
diff changeset
   826
	aMessage.Complete(KErrNone);
hgs
parents:
diff changeset
   827
	}
hgs
parents:
diff changeset
   828
hgs
parents:
diff changeset
   829
/**
hgs
parents:
diff changeset
   830
@internalTechnology
hgs
parents:
diff changeset
   831
hgs
parents:
diff changeset
   832
Modify a previously set process breakpoint.
hgs
parents:
diff changeset
   833
hgs
parents:
diff changeset
   834
@param aMessage.Int0() - The breakpoint id of the breakpoint to modify
hgs
parents:
diff changeset
   835
@param aMessage.Ptr1() - The new Process Id for the breakpoint
hgs
parents:
diff changeset
   836
@param aMessage.Int2() - The new virtual memory address for the breakpoint
hgs
parents:
diff changeset
   837
@param aMessage.Int3() - The new architecture mode for the breakpoint
hgs
parents:
diff changeset
   838
@return KErrNone if succesful. KErrPermissionDenied if the security check fails.
hgs
parents:
diff changeset
   839
 KErrAlreadyExists if there is a breakpoint overlapping the desired address.
hgs
parents:
diff changeset
   840
 KErrNotSupported if the architecture type is unrecognised.
hgs
parents:
diff changeset
   841
 KErrNoMemory if there is no more memory to complete the operation.
hgs
parents:
diff changeset
   842
 KErrArgument if the breakpoint address alignment is unsuitable for the requested
hgs
parents:
diff changeset
   843
 breakpoint.
hgs
parents:
diff changeset
   844
 KErrOverflow if there are too many breakpoints set.
hgs
parents:
diff changeset
   845
*/
hgs
parents:
diff changeset
   846
void CSecuritySvrSession::ModifyProcessBreakL(const RMessage2& aMessage)
hgs
parents:
diff changeset
   847
	{
hgs
parents:
diff changeset
   848
	const TBreakId breakId = (TBreakId)aMessage.Int0();
hgs
parents:
diff changeset
   849
	const TProcessId processId = ReadTProcessIdL(aMessage, 1);
hgs
parents:
diff changeset
   850
	const TUint32 address = aMessage.Int2();
hgs
parents:
diff changeset
   851
	const TArchitectureMode mode = (TArchitectureMode)aMessage.Int3();
hgs
parents:
diff changeset
   852
hgs
parents:
diff changeset
   853
	// Get information on the breakpoint to check the security status
hgs
parents:
diff changeset
   854
	TUint64 checkProcessId;
hgs
parents:
diff changeset
   855
	TUint32 checkAddress;
hgs
parents:
diff changeset
   856
	TArchitectureMode checkMode;
hgs
parents:
diff changeset
   857
	TBool threadSpecific;
hgs
parents:
diff changeset
   858
hgs
parents:
diff changeset
   859
	User::LeaveIfError(Server().iKernelDriver.BreakInfo(breakId,checkProcessId,checkAddress,checkMode,threadSpecific));
hgs
parents:
diff changeset
   860
hgs
parents:
diff changeset
   861
	LOG_MSG4( "CSecuritySvrSession::ModifyProcessBreakL(brkId=%d) pId=0x%x, addr=0x%x", 
hgs
parents:
diff changeset
   862
			breakId, I64LOW(processId.Id()), address );
hgs
parents:
diff changeset
   863
hgs
parents:
diff changeset
   864
hgs
parents:
diff changeset
   865
	// Security check that the process Id is associated with the debug agent
hgs
parents:
diff changeset
   866
hgs
parents:
diff changeset
   867
	//check that the agent has attached to the target process
hgs
parents:
diff changeset
   868
	CheckAttachedL(TProcessId(checkProcessId), aMessage, EFalse);
hgs
parents:
diff changeset
   869
hgs
parents:
diff changeset
   870
	// now check that the process Id which is being set is permitted
hgs
parents:
diff changeset
   871
	//check that the agent has attached to the target process
hgs
parents:
diff changeset
   872
	CheckAttachedL(processId, aMessage, EFalse);
hgs
parents:
diff changeset
   873
hgs
parents:
diff changeset
   874
	User::LeaveIfError(Server().iKernelDriver.ModifyProcessBreak(breakId,processId,address,mode));
hgs
parents:
diff changeset
   875
hgs
parents:
diff changeset
   876
	aMessage.Complete(KErrNone);
hgs
parents:
diff changeset
   877
	}
hgs
parents:
diff changeset
   878
hgs
parents:
diff changeset
   879
/**
hgs
parents:
diff changeset
   880
@param aMessage.Int0() - Breakpoint Id of interest
hgs
parents:
diff changeset
   881
@param aMessage.Ptr1() - Address in Debug Agent to place process Id of the breakpoint
hgs
parents:
diff changeset
   882
@param aMessage.Ptr2() - Address in Debug Agent to place address of the breakpoint
hgs
parents:
diff changeset
   883
@param aMessage.Ptr3() - Address in Debug Agent to place the architecture mode of the breakpoint
hgs
parents:
diff changeset
   884
@leave Any error which may be returned by RSessionBase::SendReceive()
hgs
parents:
diff changeset
   885
*/
hgs
parents:
diff changeset
   886
void CSecuritySvrSession::ProcessBreakInfoL(const RMessage2& aMessage)
hgs
parents:
diff changeset
   887
	{
hgs
parents:
diff changeset
   888
	const TBreakId breakId = (TBreakId)aMessage.Int0();
hgs
parents:
diff changeset
   889
hgs
parents:
diff changeset
   890
	TProcessId procId;
hgs
parents:
diff changeset
   891
	TUint32 address;
hgs
parents:
diff changeset
   892
	TArchitectureMode mode;
hgs
parents:
diff changeset
   893
	TBool threadSpecific;
hgs
parents:
diff changeset
   894
hgs
parents:
diff changeset
   895
	TUint64 procIdData;
hgs
parents:
diff changeset
   896
	User::LeaveIfError(Server().iKernelDriver.BreakInfo(breakId,procIdData,address,mode,threadSpecific));
hgs
parents:
diff changeset
   897
	if(threadSpecific)
hgs
parents:
diff changeset
   898
		{
hgs
parents:
diff changeset
   899
		User::Leave(KErrNotFound);
hgs
parents:
diff changeset
   900
		}
hgs
parents:
diff changeset
   901
	procId = TProcessId(procIdData);
hgs
parents:
diff changeset
   902
hgs
parents:
diff changeset
   903
	//check that the agent has attached to the target process
hgs
parents:
diff changeset
   904
	CheckAttachedL(procId, aMessage, EFalse);
hgs
parents:
diff changeset
   905
hgs
parents:
diff changeset
   906
	// return the processId
hgs
parents:
diff changeset
   907
	WriteDataL(aMessage, 1, &procId, sizeof(procId));
hgs
parents:
diff changeset
   908
hgs
parents:
diff changeset
   909
	// return the address
hgs
parents:
diff changeset
   910
	WriteDataL(aMessage, 2, &address, sizeof(address));
hgs
parents:
diff changeset
   911
hgs
parents:
diff changeset
   912
	// return the mode
hgs
parents:
diff changeset
   913
	WriteDataL(aMessage, 3, &mode, sizeof(mode));
hgs
parents:
diff changeset
   914
hgs
parents:
diff changeset
   915
	aMessage.Complete(KErrNone);
hgs
parents:
diff changeset
   916
	}
hgs
parents:
diff changeset
   917
hgs
parents:
diff changeset
   918
/**
hgs
parents:
diff changeset
   919
Read register values.
hgs
parents:
diff changeset
   920
hgs
parents:
diff changeset
   921
@param aMessage should contain:
hgs
parents:
diff changeset
   922
        * at offset 0 a pointer to the thread ID of the target thread
hgs
parents:
diff changeset
   923
        * at offset 1 a descriptor representing an array of TRegisterInfo 
hgs
parents:
diff changeset
   924
          register IDs
hgs
parents:
diff changeset
   925
        * at offset 2 a descriptor representing an array into which TRegister 
hgs
parents:
diff changeset
   926
          register values will be written
hgs
parents:
diff changeset
   927
        * at offset 3 a descriptor representing an array into which TUint8 
hgs
parents:
diff changeset
   928
          register flags will be written
hgs
parents:
diff changeset
   929
hgs
parents:
diff changeset
   930
@leave KErrArgument if the max length of the array at offset 1 is not a 
hgs
parents:
diff changeset
   931
       multiple of sizeof(TRegisterInfo), if the max length of the array 
hgs
parents:
diff changeset
   932
       at offset 2 is not a multiple of sizeof(TRegister), if the max 
hgs
parents:
diff changeset
   933
       length of the array at offset 3 is not a multiple of sizeof(TUint8), if
hgs
parents:
diff changeset
   934
       any of the descriptors have max length of 0, or if the three 
hgs
parents:
diff changeset
   935
       descriptors do not represent the same number of registers,
hgs
parents:
diff changeset
   936
       KErrNoMemory if there is insufficient memory,
hgs
parents:
diff changeset
   937
       KErrDied, if the thread with thread ID aThreadId is dead
hgs
parents:
diff changeset
   938
*/
hgs
parents:
diff changeset
   939
void CSecuritySvrSession::ReadRegistersL(const RMessage2& aMessage)
hgs
parents:
diff changeset
   940
	{
hgs
parents:
diff changeset
   941
	LOG_MSG( "CSecuritySvrSession::ReadRegistersL()\n" );
hgs
parents:
diff changeset
   942
hgs
parents:
diff changeset
   943
	const TThreadId threadId = ReadTThreadIdL(aMessage, 0);
hgs
parents:
diff changeset
   944
hgs
parents:
diff changeset
   945
	//check the agent is attached to the thread
hgs
parents:
diff changeset
   946
	CheckAttachedL(threadId, aMessage, ETrue);
hgs
parents:
diff changeset
   947
hgs
parents:
diff changeset
   948
	//number of registers being requested
hgs
parents:
diff changeset
   949
	TUint32 numberOfRegisters;
hgs
parents:
diff changeset
   950
hgs
parents:
diff changeset
   951
	//check length of descriptors is acceptable
hgs
parents:
diff changeset
   952
	ValidateRegisterBuffersL(aMessage, numberOfRegisters);
hgs
parents:
diff changeset
   953
hgs
parents:
diff changeset
   954
	// Passed data will be saved in this descriptor.
hgs
parents:
diff changeset
   955
	RBuf8 ids;
hgs
parents:
diff changeset
   956
	ids.CreateL(numberOfRegisters * sizeof(TRegisterInfo));
hgs
parents:
diff changeset
   957
	// Do the right cleanup if anything subsequently goes wrong
hgs
parents:
diff changeset
   958
	ids.CleanupClosePushL();
hgs
parents:
diff changeset
   959
	
hgs
parents:
diff changeset
   960
	//read the data from the client thread
hgs
parents:
diff changeset
   961
	aMessage.ReadL(1, ids);
hgs
parents:
diff changeset
   962
hgs
parents:
diff changeset
   963
	//create buffer to fill with data from target debug thread
hgs
parents:
diff changeset
   964
	HBufC8 *data = HBufC8::NewLC(aMessage.GetDesMaxLength(2));
hgs
parents:
diff changeset
   965
	TPtr8 values(data->Des());   
hgs
parents:
diff changeset
   966
	
hgs
parents:
diff changeset
   967
	HBufC8 *flagsData = HBufC8::NewLC(numberOfRegisters * sizeof(TUint8));
hgs
parents:
diff changeset
   968
	TPtr8 flags(flagsData->Des());   
hgs
parents:
diff changeset
   969
	
hgs
parents:
diff changeset
   970
	//get register info and return relevant parts back to agent
hgs
parents:
diff changeset
   971
	User::LeaveIfError(Server().iKernelDriver.ReadRegisters(threadId, ids, values, flags));
hgs
parents:
diff changeset
   972
	aMessage.WriteL(2, values);
hgs
parents:
diff changeset
   973
	aMessage.WriteL(3, flags);
hgs
parents:
diff changeset
   974
	
hgs
parents:
diff changeset
   975
	//delete temporary buffers and return status
hgs
parents:
diff changeset
   976
	CleanupStack::PopAndDestroy(flagsData);
hgs
parents:
diff changeset
   977
	CleanupStack::PopAndDestroy(data);
hgs
parents:
diff changeset
   978
	CleanupStack::PopAndDestroy(&ids);
hgs
parents:
diff changeset
   979
hgs
parents:
diff changeset
   980
	aMessage.Complete(KErrNone);
hgs
parents:
diff changeset
   981
	}
hgs
parents:
diff changeset
   982
hgs
parents:
diff changeset
   983
/**
hgs
parents:
diff changeset
   984
Write register values.
hgs
parents:
diff changeset
   985
hgs
parents:
diff changeset
   986
@param aMessage should contain:
hgs
parents:
diff changeset
   987
        * at offset 0 a pointer to the thread ID of the target thread
hgs
parents:
diff changeset
   988
        * at offset 1 a descriptor representing an array of TRegisterInfo 
hgs
parents:
diff changeset
   989
          register IDs
hgs
parents:
diff changeset
   990
        * at offset 2 a descriptor representing an array of TRegister register 
hgs
parents:
diff changeset
   991
          values
hgs
parents:
diff changeset
   992
        * at offset 3 a descriptor representing an array into which TUint8 
hgs
parents:
diff changeset
   993
          register flags will be written
hgs
parents:
diff changeset
   994
hgs
parents:
diff changeset
   995
@leave KErrArgument if the max length of the array at offset 1 is not a 
hgs
parents:
diff changeset
   996
       multiple of sizeof(TRegisterInfo), if the max length of the array 
hgs
parents:
diff changeset
   997
       at offset 2 is not a multiple of sizeof(TRegister), if the max 
hgs
parents:
diff changeset
   998
       length of the array at offset 3 is not a multiple of sizeof(TUint8), if
hgs
parents:
diff changeset
   999
       any of the descriptors have max length of 0, or if the three 
hgs
parents:
diff changeset
  1000
       descriptors do not represent the same number of registers,
hgs
parents:
diff changeset
  1001
       KErrNoMemory if there is insufficient memory,
hgs
parents:
diff changeset
  1002
       KErrDied, if the thread with thread ID aThreadId is dead
hgs
parents:
diff changeset
  1003
*/
hgs
parents:
diff changeset
  1004
void CSecuritySvrSession::WriteRegistersL(const RMessage2& aMessage)
hgs
parents:
diff changeset
  1005
	{
hgs
parents:
diff changeset
  1006
	LOG_MSG( "CSecuritySvrSession::WriteRegistersL()\n" );
hgs
parents:
diff changeset
  1007
hgs
parents:
diff changeset
  1008
	const TThreadId threadId = ReadTThreadIdL(aMessage, 0);
hgs
parents:
diff changeset
  1009
hgs
parents:
diff changeset
  1010
	CheckAttachedL(threadId, aMessage, EFalse);
hgs
parents:
diff changeset
  1011
hgs
parents:
diff changeset
  1012
	//number of registers attempting to set
hgs
parents:
diff changeset
  1013
	TUint32 numberOfRegisters;
hgs
parents:
diff changeset
  1014
hgs
parents:
diff changeset
  1015
	//check length of descriptors is acceptable
hgs
parents:
diff changeset
  1016
	ValidateRegisterBuffersL(aMessage, numberOfRegisters);
hgs
parents:
diff changeset
  1017
hgs
parents:
diff changeset
  1018
	// Passed register ids will be saved in this descriptor.
hgs
parents:
diff changeset
  1019
	RBuf8 ids;
hgs
parents:
diff changeset
  1020
hgs
parents:
diff changeset
  1021
	//allocate buffer
hgs
parents:
diff changeset
  1022
	ids.CreateL(numberOfRegisters * sizeof(TRegisterInfo));
hgs
parents:
diff changeset
  1023
hgs
parents:
diff changeset
  1024
	// Do the right cleanup if anything subsequently goes wrong
hgs
parents:
diff changeset
  1025
	ids.CleanupClosePushL();
hgs
parents:
diff changeset
  1026
hgs
parents:
diff changeset
  1027
	//read the data from the client thread
hgs
parents:
diff changeset
  1028
	aMessage.ReadL(1, ids);
hgs
parents:
diff changeset
  1029
hgs
parents:
diff changeset
  1030
	// Passed register values will be saved in this descriptor.
hgs
parents:
diff changeset
  1031
	RBuf8 values;
hgs
parents:
diff changeset
  1032
hgs
parents:
diff changeset
  1033
	//allocate buffer
hgs
parents:
diff changeset
  1034
	values.CreateL(aMessage.GetDesMaxLength(2));
hgs
parents:
diff changeset
  1035
	// Do the right cleanup if anything subsequently goes wrong
hgs
parents:
diff changeset
  1036
	values.CleanupClosePushL();
hgs
parents:
diff changeset
  1037
	//read the data from the client thread
hgs
parents:
diff changeset
  1038
	aMessage.ReadL(2,values);
hgs
parents:
diff changeset
  1039
hgs
parents:
diff changeset
  1040
	HBufC8 *flagsData = HBufC8::NewLC(numberOfRegisters*sizeof(TUint8));
hgs
parents:
diff changeset
  1041
	TPtr8 flags(flagsData->Des());
hgs
parents:
diff changeset
  1042
hgs
parents:
diff changeset
  1043
	//get register info and return relevant parts back to agent
hgs
parents:
diff changeset
  1044
	User::LeaveIfError(Server().iKernelDriver.WriteRegisters(threadId, ids, values, flags));
hgs
parents:
diff changeset
  1045
hgs
parents:
diff changeset
  1046
	//write flags data back
hgs
parents:
diff changeset
  1047
	aMessage.WriteL(3, flags);
hgs
parents:
diff changeset
  1048
hgs
parents:
diff changeset
  1049
	CleanupStack::PopAndDestroy(flagsData);
hgs
parents:
diff changeset
  1050
	CleanupStack::PopAndDestroy(&values);
hgs
parents:
diff changeset
  1051
	CleanupStack::PopAndDestroy(&ids);
hgs
parents:
diff changeset
  1052
hgs
parents:
diff changeset
  1053
	aMessage.Complete(KErrNone);
hgs
parents:
diff changeset
  1054
	}
hgs
parents:
diff changeset
  1055
hgs
parents:
diff changeset
  1056
/**
hgs
parents:
diff changeset
  1057
Processes an attach request from a debug agent. Gets the target debug
hgs
parents:
diff changeset
  1058
processes' original FileName as an argument. The method sets completion
hgs
parents:
diff changeset
  1059
status of the aMessage argument to KErrNone if successfully attached and to
hgs
parents:
diff changeset
  1060
another of the system wide error codes if there were problems.
hgs
parents:
diff changeset
  1061
hgs
parents:
diff changeset
  1062
@param aMessage contains:
hgs
parents:
diff changeset
  1063
       * a boolean at offset 0 which indicates whether the agent wishes to
hgs
parents:
diff changeset
  1064
       attach passively
hgs
parents:
diff changeset
  1065
       * a buffer at offset 1 which contains the FileName
hgs
parents:
diff changeset
  1066
       of the target debug process.
hgs
parents:
diff changeset
  1067
*/
hgs
parents:
diff changeset
  1068
void CSecuritySvrSession::AttachProcessL(const RMessage2& aMessage)
hgs
parents:
diff changeset
  1069
	{
hgs
parents:
diff changeset
  1070
	LOG_MSG( "CSecuritySvrSession::AttachProcessL()\n" );
hgs
parents:
diff changeset
  1071
hgs
parents:
diff changeset
  1072
	const TBool passive = aMessage.Int0();
hgs
parents:
diff changeset
  1073
hgs
parents:
diff changeset
  1074
	TInt deslen = aMessage.GetDesLengthL(1);
hgs
parents:
diff changeset
  1075
hgs
parents:
diff changeset
  1076
	// Passed data will be saved in this descriptor.
hgs
parents:
diff changeset
  1077
	RBuf processName;
hgs
parents:
diff changeset
  1078
hgs
parents:
diff changeset
  1079
	// Max length set to the value of "deslen", but current length is zero
hgs
parents:
diff changeset
  1080
	processName.CreateL(deslen);
hgs
parents:
diff changeset
  1081
hgs
parents:
diff changeset
  1082
	// Do the right cleanup if anything subsequently goes wrong
hgs
parents:
diff changeset
  1083
	processName.CleanupClosePushL();
hgs
parents:
diff changeset
  1084
hgs
parents:
diff changeset
  1085
	// Copy the client's descriptor data into our buffer.
hgs
parents:
diff changeset
  1086
	aMessage.ReadL(1,processName);
hgs
parents:
diff changeset
  1087
hgs
parents:
diff changeset
  1088
	//
hgs
parents:
diff changeset
  1089
	// Security Check
hgs
parents:
diff changeset
  1090
	//
hgs
parents:
diff changeset
  1091
	// It is not permitted to debug the debug security server!
hgs
parents:
diff changeset
  1092
	//
hgs
parents:
diff changeset
  1093
	// get the secure id of the executable
hgs
parents:
diff changeset
  1094
	TUid secureId(TUid::Null());
hgs
parents:
diff changeset
  1095
	GetSecureIdL(processName, secureId);
hgs
parents:
diff changeset
  1096
	if (KUidDebugSecurityServer.iUid == secureId.iUid)
hgs
parents:
diff changeset
  1097
		{
hgs
parents:
diff changeset
  1098
		// The debug agent has requested to debug the Debug Security Server
hgs
parents:
diff changeset
  1099
		// This is either an error, or an attempt to breach security. We
hgs
parents:
diff changeset
  1100
		// therefore refuse to agree to this request, and return KErrPermissionDenied
hgs
parents:
diff changeset
  1101
		LOG_MSG("Debug Agent attempted to debug the Debug Security Server");
hgs
parents:
diff changeset
  1102
		User::Leave(KErrPermissionDenied);
hgs
parents:
diff changeset
  1103
		}
hgs
parents:
diff changeset
  1104
hgs
parents:
diff changeset
  1105
	// Check the OEM Debug token capabilities 
hgs
parents:
diff changeset
  1106
	GetDebugAgentOEMTokenCapsL();
hgs
parents:
diff changeset
  1107
	
hgs
parents:
diff changeset
  1108
	// Get the Security info via rlibrary::getinfo
hgs
parents:
diff changeset
  1109
	RLibrary::TInfo info;
hgs
parents:
diff changeset
  1110
	TPckg<RLibrary::TInfo> infoBuf(info);
hgs
parents:
diff changeset
  1111
hgs
parents:
diff changeset
  1112
	TInt err = RLibrary::GetInfo(processName, infoBuf);
hgs
parents:
diff changeset
  1113
	if (err != KErrNone)
hgs
parents:
diff changeset
  1114
		{
hgs
parents:
diff changeset
  1115
		LOG_MSG2("Cannot parse the target executable header, err=%d", err);
hgs
parents:
diff changeset
  1116
		// Could not read the header for this executable :-(
hgs
parents:
diff changeset
  1117
		CleanupStack::PopAndDestroy(&processName);
hgs
parents:
diff changeset
  1118
		aMessage.Complete(err);
hgs
parents:
diff changeset
  1119
		return;
hgs
parents:
diff changeset
  1120
		}
hgs
parents:
diff changeset
  1121
	
hgs
parents:
diff changeset
  1122
	// Special case for AllFiles - OEM Debug tokens MUST have
hgs
parents:
diff changeset
  1123
	// AllFiles, as this is what allows them to read contents
hgs
parents:
diff changeset
  1124
	// of other executables.
hgs
parents:
diff changeset
  1125
	TBool checkDebuggable = ETrue;
hgs
parents:
diff changeset
  1126
hgs
parents:
diff changeset
  1127
	// Does an OEM Debug Token permit debug where it would normally not be
hgs
parents:
diff changeset
  1128
	// permitted?
hgs
parents:
diff changeset
  1129
	if ( Server().OEMTokenPermitsDebugL(iOEMDebugCapabilities, info.iSecurityInfo.iCaps) )
hgs
parents:
diff changeset
  1130
		{
hgs
parents:
diff changeset
  1131
		// OEM Debug token is valid and has sufficient capabilities
hgs
parents:
diff changeset
  1132
		LOG_MSG("CSecuritySvrSession::AttachProcessL() - Debug Agent has sufficient capabilites based on OEM Debug Token");	
hgs
parents:
diff changeset
  1133
		
hgs
parents:
diff changeset
  1134
		checkDebuggable = EFalse;
hgs
parents:
diff changeset
  1135
		}
hgs
parents:
diff changeset
  1136
hgs
parents:
diff changeset
  1137
	if (checkDebuggable)
hgs
parents:
diff changeset
  1138
		{
hgs
parents:
diff changeset
  1139
		// OEM Debug token (if any), does not confer sufficient capabilities to
hgs
parents:
diff changeset
  1140
		// debug the specified target executable. Therefore debugging can only
hgs
parents:
diff changeset
  1141
		// be permitted if the target executable itself has been built as 'Debuggable'
hgs
parents:
diff changeset
  1142
		LOG_MSG("CSecuritySvrSession::AttachProcessL() - Debug Agent has insufficient capabilites based on OEM Debug Token");	
hgs
parents:
diff changeset
  1143
hgs
parents:
diff changeset
  1144
		IsDebuggableL(processName);
hgs
parents:
diff changeset
  1145
		}
hgs
parents:
diff changeset
  1146
hgs
parents:
diff changeset
  1147
	User::LeaveIfError(Server().AttachProcessL(processName, iDebugAgentProcessId, passive));
hgs
parents:
diff changeset
  1148
hgs
parents:
diff changeset
  1149
	// Inform the kernel driver about the attachment, so that it
hgs
parents:
diff changeset
  1150
	// can track per-agent data about the process.
hgs
parents:
diff changeset
  1151
	RBuf8 processName8;
hgs
parents:
diff changeset
  1152
hgs
parents:
diff changeset
  1153
	processName8.CreateL(deslen);
hgs
parents:
diff changeset
  1154
hgs
parents:
diff changeset
  1155
	processName8.CleanupClosePushL();
hgs
parents:
diff changeset
  1156
hgs
parents:
diff changeset
  1157
	processName8.Copy(processName);
hgs
parents:
diff changeset
  1158
hgs
parents:
diff changeset
  1159
	User::LeaveIfError(Server().iKernelDriver.AttachProcess(processName8, iDebugAgentProcessId.Id()));
hgs
parents:
diff changeset
  1160
hgs
parents:
diff changeset
  1161
	// Create an Active Object to handle asynchronous calls to GetEvent
hgs
parents:
diff changeset
  1162
	CSecuritySvrAsync* handler = CSecuritySvrAsync::NewL(this,processName8,iDebugAgentProcessId);
hgs
parents:
diff changeset
  1163
hgs
parents:
diff changeset
  1164
	err = iAsyncHandlers.Insert(handler,0);
hgs
parents:
diff changeset
  1165
	if (err != KErrNone)
hgs
parents:
diff changeset
  1166
		{
hgs
parents:
diff changeset
  1167
		// If we don't have an asynchronous handler, we should detach
hgs
parents:
diff changeset
  1168
		// the driver as well.
hgs
parents:
diff changeset
  1169
		Server().iKernelDriver.DetachProcess(processName8,iDebugAgentProcessId.Id());
hgs
parents:
diff changeset
  1170
		Server().DetachProcess(processName, iDebugAgentProcessId);
hgs
parents:
diff changeset
  1171
		// The DSS should NEVER panic itself. If the above calls fail, so be it we will attempt to limp on
hgs
parents:
diff changeset
  1172
		}
hgs
parents:
diff changeset
  1173
hgs
parents:
diff changeset
  1174
	User::LeaveIfError(err);
hgs
parents:
diff changeset
  1175
hgs
parents:
diff changeset
  1176
	CleanupStack::PopAndDestroy(&processName8);
hgs
parents:
diff changeset
  1177
hgs
parents:
diff changeset
  1178
	CleanupStack::PopAndDestroy(&processName);
hgs
parents:
diff changeset
  1179
hgs
parents:
diff changeset
  1180
	aMessage.Complete(KErrNone);
hgs
parents:
diff changeset
  1181
	}
hgs
parents:
diff changeset
  1182
hgs
parents:
diff changeset
  1183
hgs
parents:
diff changeset
  1184
/**
hgs
parents:
diff changeset
  1185
Processes an attach request from a debug agent from all processes. 
hgs
parents:
diff changeset
  1186
The method sets completion status of the aMessage argument to KErrNone 
hgs
parents:
diff changeset
  1187
if successfully attached and to another of the system wide error codes 
hgs
parents:
diff changeset
  1188
if there were problems.
hgs
parents:
diff changeset
  1189
hgs
parents:
diff changeset
  1190
@param aMessage contains no data
hgs
parents:
diff changeset
  1191
*/
hgs
parents:
diff changeset
  1192
void CSecuritySvrSession::AttachAllL(const RMessage2& aMessage)
hgs
parents:
diff changeset
  1193
	{
hgs
parents:
diff changeset
  1194
	LOG_MSG( "CSecuritySvrSession::AttachAllL()\n" );
hgs
parents:
diff changeset
  1195
hgs
parents:
diff changeset
  1196
hgs
parents:
diff changeset
  1197
	// Run the OEM Debug token, if run ok then sets iOEMDebugCapabilities
hgs
parents:
diff changeset
  1198
	GetDebugAgentOEMTokenCapsL();
hgs
parents:
diff changeset
  1199
hgs
parents:
diff changeset
  1200
	// Debug token must have All caps to use AttachToAll
hgs
parents:
diff changeset
  1201
	TCapabilitySet allCaps;
hgs
parents:
diff changeset
  1202
	allCaps.SetAllSupported();
hgs
parents:
diff changeset
  1203
	if (!Server().OEMTokenPermitsDebugL(iOEMDebugCapabilities, allCaps))
hgs
parents:
diff changeset
  1204
		{
hgs
parents:
diff changeset
  1205
		LOG_MSG("Client's OEM token doesn't have capability ALL required for AttachAll()");
hgs
parents:
diff changeset
  1206
		User::Leave(KErrPermissionDenied);
hgs
parents:
diff changeset
  1207
		}
hgs
parents:
diff changeset
  1208
hgs
parents:
diff changeset
  1209
hgs
parents:
diff changeset
  1210
	User::LeaveIfError(Server().AttachProcessL(_L("*"), iDebugAgentProcessId, EFalse));
hgs
parents:
diff changeset
  1211
hgs
parents:
diff changeset
  1212
    TBuf8<1> KStar8=_L8("*");
hgs
parents:
diff changeset
  1213
hgs
parents:
diff changeset
  1214
    User::LeaveIfError(Server().iKernelDriver.AttachProcess(KStar8, iDebugAgentProcessId.Id()));
hgs
parents:
diff changeset
  1215
hgs
parents:
diff changeset
  1216
    // Create an Active Object to handle asynchronous calls to GetAllEvent
hgs
parents:
diff changeset
  1217
    CSecuritySvrAsync* handler = CSecuritySvrAsync::NewL(this,KStar8,iDebugAgentProcessId);    
hgs
parents:
diff changeset
  1218
    TInt err = iAsyncHandlers.Insert(handler,0);
hgs
parents:
diff changeset
  1219
    if (err != KErrNone)
hgs
parents:
diff changeset
  1220
        {
hgs
parents:
diff changeset
  1221
        // If we don't have an asynchronous handler, we should detach
hgs
parents:
diff changeset
  1222
        // the driver as well.
hgs
parents:
diff changeset
  1223
        Server().iKernelDriver.DetachProcess(KStar8,iDebugAgentProcessId.Id());
hgs
parents:
diff changeset
  1224
        Server().DetachProcess(_L("*"), iDebugAgentProcessId);
hgs
parents:
diff changeset
  1225
        }
hgs
parents:
diff changeset
  1226
hgs
parents:
diff changeset
  1227
    User::LeaveIfError(err);
hgs
parents:
diff changeset
  1228
hgs
parents:
diff changeset
  1229
	aMessage.Complete(KErrNone);   
hgs
parents:
diff changeset
  1230
	}
hgs
parents:
diff changeset
  1231
hgs
parents:
diff changeset
  1232
hgs
parents:
diff changeset
  1233
/**
hgs
parents:
diff changeset
  1234
Reads the OEM Debug Token associated with the debug agent if any. The OEM Debug Token
hgs
parents:
diff changeset
  1235
allows the Debug Agent to debug certain executables which have not been built as
hgs
parents:
diff changeset
  1236
'Debuggable'.
hgs
parents:
diff changeset
  1237
hgs
parents:
diff changeset
  1238
This works as follows: The OEM Debug Token is an executable with a special name
hgs
parents:
diff changeset
  1239
of the form "OEMDebug_<DA_SID>.exe" where <DA_SID> is the Secure ID of the Debug Agent
hgs
parents:
diff changeset
  1240
in hexadecimal. For example: "OEMDebug_F123ABCD.exe" would be a valid name. This token executable
hgs
parents:
diff changeset
  1241
must be signed with 'AllFiles' + X, where X is the set of PlatSec capabilities that are
hgs
parents:
diff changeset
  1242
possessed by the target executable to be debugged.
hgs
parents:
diff changeset
  1243
hgs
parents:
diff changeset
  1244
This function reads the capabilities possessed by the token by creating a process based
hgs
parents:
diff changeset
  1245
on the executable, and reading the TSecurityInfo associated with the process. This ensures
hgs
parents:
diff changeset
  1246
that the loader has validated the token has not been tampered with and that the security
hgs
parents:
diff changeset
  1247
information is valid.
hgs
parents:
diff changeset
  1248
hgs
parents:
diff changeset
  1249
The security information is then stored for future use as member data in iOEMDebugCapabilities.
hgs
parents:
diff changeset
  1250
hgs
parents:
diff changeset
  1251
Leaves if there is an error, otherwise simply fills in the capabilities
hgs
parents:
diff changeset
  1252
in iOEMDebugCapabilities.
hgs
parents:
diff changeset
  1253
hgs
parents:
diff changeset
  1254
It is not an error for the OEM Debug token not to exist. In this case, the function simply returns.
hgs
parents:
diff changeset
  1255
*/
hgs
parents:
diff changeset
  1256
void CSecuritySvrSession::GetDebugAgentOEMTokenCapsL(void)
hgs
parents:
diff changeset
  1257
	{
hgs
parents:
diff changeset
  1258
	if (iOEMDebugCapabilities.HasCapability(ECapabilityAllFiles))
hgs
parents:
diff changeset
  1259
		{
hgs
parents:
diff changeset
  1260
		// Then we've already read the caps - wasteful to read them again
hgs
parents:
diff changeset
  1261
		return;
hgs
parents:
diff changeset
  1262
		}
hgs
parents:
diff changeset
  1263
hgs
parents:
diff changeset
  1264
	// Obtain the security info about the debug agent process
hgs
parents:
diff changeset
  1265
	//get the debug agent's process
hgs
parents:
diff changeset
  1266
	RProcess debugAgentProcess;
hgs
parents:
diff changeset
  1267
hgs
parents:
diff changeset
  1268
	CleanupClosePushL(debugAgentProcess);
hgs
parents:
diff changeset
  1269
hgs
parents:
diff changeset
  1270
	debugAgentProcess.Open(iDebugAgentProcessId);
hgs
parents:
diff changeset
  1271
hgs
parents:
diff changeset
  1272
	// We have now obtained a process handle based on the token executable, so we can check its security properties.
hgs
parents:
diff changeset
  1273
	TSecurityInfo secInfo(debugAgentProcess);
hgs
parents:
diff changeset
  1274
hgs
parents:
diff changeset
  1275
	// Compute the name of the OEM debug token based on the SID of the debug agent
hgs
parents:
diff changeset
  1276
	_LIT(KDSSOEMDebugTokenPrefix,"OEMDebug_");
hgs
parents:
diff changeset
  1277
	_LIT(KDSSOEMDebugTokenAppendFmt,"%08X.exe");
hgs
parents:
diff changeset
  1278
hgs
parents:
diff changeset
  1279
	RBuf agentTokenName;
hgs
parents:
diff changeset
  1280
	agentTokenName.CreateL(KDSSOEMDebugTokenPrefix().Size()+8+1);	// allow space for SID+null terminator
hgs
parents:
diff changeset
  1281
	agentTokenName.CleanupClosePushL();
hgs
parents:
diff changeset
  1282
hgs
parents:
diff changeset
  1283
	agentTokenName.SetLength(0);
hgs
parents:
diff changeset
  1284
hgs
parents:
diff changeset
  1285
	// Add OEMDebug_
hgs
parents:
diff changeset
  1286
	agentTokenName.Append(KDSSOEMDebugTokenPrefix());
hgs
parents:
diff changeset
  1287
hgs
parents:
diff changeset
  1288
	// Add debug agent Secure ID
hgs
parents:
diff changeset
  1289
	agentTokenName.AppendFormat(KDSSOEMDebugTokenAppendFmt,secInfo.iSecureId.iId);
hgs
parents:
diff changeset
  1290
	
hgs
parents:
diff changeset
  1291
	// just log the token name for the moment.
hgs
parents:
diff changeset
  1292
	RBuf8 agentTokenName8;
hgs
parents:
diff changeset
  1293
hgs
parents:
diff changeset
  1294
	agentTokenName8.CreateL(agentTokenName.Length()+1);
hgs
parents:
diff changeset
  1295
hgs
parents:
diff changeset
  1296
	agentTokenName8.CleanupClosePushL();
hgs
parents:
diff changeset
  1297
hgs
parents:
diff changeset
  1298
	agentTokenName8.Copy(agentTokenName);
hgs
parents:
diff changeset
  1299
hgs
parents:
diff changeset
  1300
	agentTokenName8.Append(TChar(0));
hgs
parents:
diff changeset
  1301
hgs
parents:
diff changeset
  1302
	LOG_MSG2("CSecuritySvrSession::GetDebugAgentOEMTokenCapsL() - OEM Debug Token Name is %s",agentTokenName8.Ptr()); 
hgs
parents:
diff changeset
  1303
hgs
parents:
diff changeset
  1304
	// Cleanup
hgs
parents:
diff changeset
  1305
	CleanupStack::PopAndDestroy(&agentTokenName8);
hgs
parents:
diff changeset
  1306
hgs
parents:
diff changeset
  1307
	// Now locate and start the executable...
hgs
parents:
diff changeset
  1308
	RProcess agentToken;
hgs
parents:
diff changeset
  1309
	TInt err = agentToken.Create(agentTokenName, KNullDesC);
hgs
parents:
diff changeset
  1310
	if (KErrNone != err)
hgs
parents:
diff changeset
  1311
		{
hgs
parents:
diff changeset
  1312
		// Failed to create a process based on the token, just give up
hgs
parents:
diff changeset
  1313
		LOG_MSG2("CSecuritySvrSession::GetDebugAgentOEMTokenCapsL() - Could not create process based on token due to err 0x%8x\n",err);
hgs
parents:
diff changeset
  1314
		
hgs
parents:
diff changeset
  1315
		// Cleanup remaining items from the stack
hgs
parents:
diff changeset
  1316
		CleanupStack::PopAndDestroy(&agentTokenName);
hgs
parents:
diff changeset
  1317
hgs
parents:
diff changeset
  1318
		CleanupStack::PopAndDestroy(&debugAgentProcess);
hgs
parents:
diff changeset
  1319
		return;
hgs
parents:
diff changeset
  1320
		}
hgs
parents:
diff changeset
  1321
hgs
parents:
diff changeset
  1322
	// Synchronise with the process to make sure it hasn't died straight away
hgs
parents:
diff changeset
  1323
	TRequestStatus stat;
hgs
parents:
diff changeset
  1324
	agentToken.Rendezvous(stat);
hgs
parents:
diff changeset
  1325
	if (stat != KRequestPending)
hgs
parents:
diff changeset
  1326
		{
hgs
parents:
diff changeset
  1327
		// logon failed - agentToken is not yet running, so cannot have terminated
hgs
parents:
diff changeset
  1328
		agentToken.Kill(0);             // Abort startup
hgs
parents:
diff changeset
  1329
		}
hgs
parents:
diff changeset
  1330
hgs
parents:
diff changeset
  1331
	// store the OEM Debug Token security data 
hgs
parents:
diff changeset
  1332
	TSecurityInfo agentSecInfo(agentToken);
hgs
parents:
diff changeset
  1333
hgs
parents:
diff changeset
  1334
	// Note capabilities for future use
hgs
parents:
diff changeset
  1335
	iOEMDebugCapabilities=agentSecInfo.iCaps;
hgs
parents:
diff changeset
  1336
	
hgs
parents:
diff changeset
  1337
	// resume the token. It _should_ just exit, but we don't really care.
hgs
parents:
diff changeset
  1338
	agentToken.Resume();
hgs
parents:
diff changeset
  1339
hgs
parents:
diff changeset
  1340
	// Wait to synchronise with agentToken - if it dies in the meantime, it
hgs
parents:
diff changeset
  1341
	// also gets completed
hgs
parents:
diff changeset
  1342
	User::WaitForRequest(stat);
hgs
parents:
diff changeset
  1343
hgs
parents:
diff changeset
  1344
	// Just close the handle to it again.
hgs
parents:
diff changeset
  1345
	agentToken.Close();
hgs
parents:
diff changeset
  1346
hgs
parents:
diff changeset
  1347
	// Cleanup remaining items from the stack
hgs
parents:
diff changeset
  1348
	CleanupStack::PopAndDestroy(&agentTokenName);
hgs
parents:
diff changeset
  1349
hgs
parents:
diff changeset
  1350
	CleanupStack::PopAndDestroy(&debugAgentProcess);
hgs
parents:
diff changeset
  1351
hgs
parents:
diff changeset
  1352
	}
hgs
parents:
diff changeset
  1353
hgs
parents:
diff changeset
  1354
/**
hgs
parents:
diff changeset
  1355
  Checks whether the file passed in as aExecutable is XIP or not
hgs
parents:
diff changeset
  1356
hgs
parents:
diff changeset
  1357
  @param aExecutable file to check
hgs
parents:
diff changeset
  1358
  @return ETrue if the file is XIP, EFalse otherwise
hgs
parents:
diff changeset
  1359
  */
hgs
parents:
diff changeset
  1360
TBool CSecuritySvrSession::IsExecutableXipL(RFile& aExecutable)
hgs
parents:
diff changeset
  1361
	{
hgs
parents:
diff changeset
  1362
	TUint atts;
hgs
parents:
diff changeset
  1363
	User::LeaveIfError(aExecutable.Att(atts));
hgs
parents:
diff changeset
  1364
hgs
parents:
diff changeset
  1365
	return atts & KEntryAttXIP;
hgs
parents:
diff changeset
  1366
	}
hgs
parents:
diff changeset
  1367
hgs
parents:
diff changeset
  1368
/**
hgs
parents:
diff changeset
  1369
  Gets access to the symbian crash partition for crash access operation.
hgs
parents:
diff changeset
  1370
  */
hgs
parents:
diff changeset
  1371
void CSecuritySvrSession::ConnectCrashPartitionL (void)
hgs
parents:
diff changeset
  1372
	{
hgs
parents:
diff changeset
  1373
	LOG_MSG("CSecuritySvrSession::ConnectCrashPartitionL()");
hgs
parents:
diff changeset
  1374
	
hgs
parents:
diff changeset
  1375
	TBool changed;
hgs
parents:
diff changeset
  1376
	TInt error = KErrNone;
hgs
parents:
diff changeset
  1377
	TInt i=0;
hgs
parents:
diff changeset
  1378
	
hgs
parents:
diff changeset
  1379
	//Intialising to EFalse
hgs
parents:
diff changeset
  1380
	iCrashConnected = EFalse;
hgs
parents:
diff changeset
  1381
	
hgs
parents:
diff changeset
  1382
	TPckg<TLocalDriveCapsV2> capsBuf(iCaps);
hgs
parents:
diff changeset
  1383
	
hgs
parents:
diff changeset
  1384
	//check for the symbian crash partition
hgs
parents:
diff changeset
  1385
	for (i=0; i<KMaxLocalDrives; i++)
hgs
parents:
diff changeset
  1386
		{
hgs
parents:
diff changeset
  1387
		error = iLocalDrive.Connect (i, changed);
hgs
parents:
diff changeset
  1388
		if ( error == KErrNone)
hgs
parents:
diff changeset
  1389
			{
hgs
parents:
diff changeset
  1390
			error = iLocalDrive.Caps(capsBuf);
hgs
parents:
diff changeset
  1391
			if ( error != KErrNone)
hgs
parents:
diff changeset
  1392
				{
hgs
parents:
diff changeset
  1393
				//continue if not found
hgs
parents:
diff changeset
  1394
				continue;
hgs
parents:
diff changeset
  1395
				}
hgs
parents:
diff changeset
  1396
			if ( iCaps.iPartitionType == (TUint16)KPartitionTypeSymbianCrashLog)
hgs
parents:
diff changeset
  1397
				{				
hgs
parents:
diff changeset
  1398
				LOG_MSG2("Found Symbian crash log partition on drive: %d",i);
hgs
parents:
diff changeset
  1399
				iCrashConnected = ETrue;
hgs
parents:
diff changeset
  1400
				break;
hgs
parents:
diff changeset
  1401
				}			
hgs
parents:
diff changeset
  1402
			}
hgs
parents:
diff changeset
  1403
		}
hgs
parents:
diff changeset
  1404
	if ( i == KMaxLocalDrives)
hgs
parents:
diff changeset
  1405
		{
hgs
parents:
diff changeset
  1406
		LOG_MSG("No crash log partition found with valid crash log signature found.  Exiting...");
hgs
parents:
diff changeset
  1407
		User::Leave (KErrNotFound);
hgs
parents:
diff changeset
  1408
		}
hgs
parents:
diff changeset
  1409
hgs
parents:
diff changeset
  1410
	// Nand Flash not currently supported.
hgs
parents:
diff changeset
  1411
	if (iCaps.iType == EMediaNANDFlash)
hgs
parents:
diff changeset
  1412
		{
hgs
parents:
diff changeset
  1413
		LOG_MSG( "CSecuritySvrSession::ConnectCrashPartitionL()  Nand Flash not currently supported\n" );
hgs
parents:
diff changeset
  1414
		User::Leave (KErrNotSupported);
hgs
parents:
diff changeset
  1415
		}
hgs
parents:
diff changeset
  1416
	}
hgs
parents:
diff changeset
  1417
/** Checks that aHeaderData contains enough data to cast it to the
hgs
parents:
diff changeset
  1418
  appropriate header type.
hgs
parents:
diff changeset
  1419
hgs
parents:
diff changeset
  1420
  @param aHeaderData buffer containing header data read from a file
hgs
parents:
diff changeset
  1421
  @param aXip boolean indicating whether the header data is for an XIP image
hgs
parents:
diff changeset
  1422
hgs
parents:
diff changeset
  1423
  @return ETrue if enough data in buffer, EFalse otherwise
hgs
parents:
diff changeset
  1424
  */
hgs
parents:
diff changeset
  1425
TBool CSecuritySvrSession::CheckSufficientData(const TDesC8& aHeaderData, const TBool aXip) const
hgs
parents:
diff changeset
  1426
	{
hgs
parents:
diff changeset
  1427
	TUint minimumHeaderSize = aXip ? sizeof(TRomImageHeader) : sizeof(E32ImageHeaderV);
hgs
parents:
diff changeset
  1428
	return (aHeaderData.Length() >= minimumHeaderSize);
hgs
parents:
diff changeset
  1429
	}
hgs
parents:
diff changeset
  1430
hgs
parents:
diff changeset
  1431
/**
hgs
parents:
diff changeset
  1432
  Opens a file handle to aFileName using aFileHandle
hgs
parents:
diff changeset
  1433
  @param aFileName file to open handle to
hgs
parents:
diff changeset
  1434
  @param aFs file system to use to open the handle
hgs
parents:
diff changeset
  1435
  @param aFileHandle file handle to open
hgs
parents:
diff changeset
  1436
hgs
parents:
diff changeset
  1437
  @leave one of the system wide error codes
hgs
parents:
diff changeset
  1438
  */
hgs
parents:
diff changeset
  1439
void CSecuritySvrSession::OpenFileHandleL(const TDesC& aFileName, RFs& aFs, RFile& aFileHandle)
hgs
parents:
diff changeset
  1440
	{
hgs
parents:
diff changeset
  1441
	TInt err = aFileHandle.Open(aFs, aFileName, EFileRead | EFileShareReadersOnly);
hgs
parents:
diff changeset
  1442
	if (err != KErrNone)
hgs
parents:
diff changeset
  1443
		{
hgs
parents:
diff changeset
  1444
		// Could not open the file for reading
hgs
parents:
diff changeset
  1445
		LOG_MSG("CSecuritySvrSession::OpenFileHandleL - Failed to open executable\n");
hgs
parents:
diff changeset
  1446
hgs
parents:
diff changeset
  1447
		User::Leave(err);
hgs
parents:
diff changeset
  1448
		}
hgs
parents:
diff changeset
  1449
	}
hgs
parents:
diff changeset
  1450
hgs
parents:
diff changeset
  1451
/**
hgs
parents:
diff changeset
  1452
  Checks whether an executable has the debug bit set
hgs
parents:
diff changeset
  1453
hgs
parents:
diff changeset
  1454
  @param aHeaderData buffer containing the header of the executable
hgs
parents:
diff changeset
  1455
  @param aXip indication of whether the executable is XIP or not
hgs
parents:
diff changeset
  1456
hgs
parents:
diff changeset
  1457
  @return ETrue if debug bit is set, EFalse otherwise
hgs
parents:
diff changeset
  1458
  */
hgs
parents:
diff changeset
  1459
TBool CSecuritySvrSession::IsDebugBitSet(const TDesC8& aHeaderData, const TBool aXip)
hgs
parents:
diff changeset
  1460
	{
hgs
parents:
diff changeset
  1461
	if(!CheckSufficientData(aHeaderData, aXip))
hgs
parents:
diff changeset
  1462
		{
hgs
parents:
diff changeset
  1463
		return EFalse;
hgs
parents:
diff changeset
  1464
		}
hgs
parents:
diff changeset
  1465
hgs
parents:
diff changeset
  1466
	if (aXip)
hgs
parents:
diff changeset
  1467
		{
hgs
parents:
diff changeset
  1468
		TRomImageHeader* hdr = (TRomImageHeader*)aHeaderData.Ptr();
hgs
parents:
diff changeset
  1469
		return (hdr->iFlags & KRomImageDebuggable);
hgs
parents:
diff changeset
  1470
		}
hgs
parents:
diff changeset
  1471
	else
hgs
parents:
diff changeset
  1472
		{
hgs
parents:
diff changeset
  1473
		// it is an epoc32 image
hgs
parents:
diff changeset
  1474
		E32ImageHeaderV* hdr = (E32ImageHeaderV*)aHeaderData.Ptr();
hgs
parents:
diff changeset
  1475
		return (hdr->iFlags & KImageDebuggable);
hgs
parents:
diff changeset
  1476
		}
hgs
parents:
diff changeset
  1477
	}
hgs
parents:
diff changeset
  1478
hgs
parents:
diff changeset
  1479
/**
hgs
parents:
diff changeset
  1480
Determines whether a particular executable is marked as 'debuggable'
hgs
parents:
diff changeset
  1481
hgs
parents:
diff changeset
  1482
Notes:
hgs
parents:
diff changeset
  1483
This function is currently hard coded to understand the format of e32 and
hgs
parents:
diff changeset
  1484
TRomImage file headers. Ideally this will be replaced by a call to RLibrary::GetInfo
hgs
parents:
diff changeset
  1485
which can return the 'debuggable' information. Unfortunately, this call currently
hgs
parents:
diff changeset
  1486
does not provide the information for XIP executables :-(
hgs
parents:
diff changeset
  1487
hgs
parents:
diff changeset
  1488
@leave KErrPermissionDenied if the debug bit is not set, or one of the other
hgs
parents:
diff changeset
  1489
system wide error codes
hgs
parents:
diff changeset
  1490
*/
hgs
parents:
diff changeset
  1491
void CSecuritySvrSession::IsDebuggableL(const TDesC& aFileName)
hgs
parents:
diff changeset
  1492
	{
hgs
parents:
diff changeset
  1493
#ifndef IGNORE_DEBUGGABLE_BIT
hgs
parents:
diff changeset
  1494
hgs
parents:
diff changeset
  1495
	RFs fs;
hgs
parents:
diff changeset
  1496
	User::LeaveIfError(fs.Connect());
hgs
parents:
diff changeset
  1497
	CleanupClosePushL(fs);
hgs
parents:
diff changeset
  1498
hgs
parents:
diff changeset
  1499
	RFile targetExe;
hgs
parents:
diff changeset
  1500
	OpenFileHandleL(aFileName, fs, targetExe);
hgs
parents:
diff changeset
  1501
	CleanupClosePushL(targetExe);
hgs
parents:
diff changeset
  1502
hgs
parents:
diff changeset
  1503
	// Read in the entire header
hgs
parents:
diff changeset
  1504
	RBuf8 e32HdrBuf;
hgs
parents:
diff changeset
  1505
	e32HdrBuf.CreateL(RLibrary::KRequiredImageHeaderSize);
hgs
parents:
diff changeset
  1506
	e32HdrBuf.CleanupClosePushL();
hgs
parents:
diff changeset
  1507
hgs
parents:
diff changeset
  1508
	// Read the entire header as far as possible
hgs
parents:
diff changeset
  1509
	TInt err = targetExe.Read(e32HdrBuf);
hgs
parents:
diff changeset
  1510
	if (err != KErrNone)
hgs
parents:
diff changeset
  1511
		{
hgs
parents:
diff changeset
  1512
		// Could not read the file 
hgs
parents:
diff changeset
  1513
		LOG_MSG("CSecuritySvrSession::IsDebuggableL - Failed to read executable\n");
hgs
parents:
diff changeset
  1514
hgs
parents:
diff changeset
  1515
		User::Leave(err);
hgs
parents:
diff changeset
  1516
		}
hgs
parents:
diff changeset
  1517
hgs
parents:
diff changeset
  1518
	if(!CheckSufficientData(e32HdrBuf, IsExecutableXipL(targetExe)))
hgs
parents:
diff changeset
  1519
		{
hgs
parents:
diff changeset
  1520
		User::Leave(KErrGeneral);
hgs
parents:
diff changeset
  1521
		}
hgs
parents:
diff changeset
  1522
hgs
parents:
diff changeset
  1523
	if(! IsDebugBitSet(e32HdrBuf, IsExecutableXipL(targetExe)))
hgs
parents:
diff changeset
  1524
		{
hgs
parents:
diff changeset
  1525
		User::Leave(KErrPermissionDenied);
hgs
parents:
diff changeset
  1526
		}
hgs
parents:
diff changeset
  1527
	CleanupStack::PopAndDestroy(3, &fs);
hgs
parents:
diff changeset
  1528
hgs
parents:
diff changeset
  1529
#else
hgs
parents:
diff changeset
  1530
	LOG_MSG("CSecuritySvrSession::IsDebuggableL() Debuggable bit temporarily ignored!!!");
hgs
parents:
diff changeset
  1531
#endif
hgs
parents:
diff changeset
  1532
	}
hgs
parents:
diff changeset
  1533
hgs
parents:
diff changeset
  1534
/**
hgs
parents:
diff changeset
  1535
Processes a detach request from a debug agent. Gets the target debug
hgs
parents:
diff changeset
  1536
processes' original FileName as an argument. The method sets completion
hgs
parents:
diff changeset
  1537
status of the aMessage argument to KErrNone if successfully detached and to
hgs
parents:
diff changeset
  1538
another of the system wide error codes if there were problems.
hgs
parents:
diff changeset
  1539
hgs
parents:
diff changeset
  1540
@param aMessage contains:
hgs
parents:
diff changeset
  1541
       * a buffer at offset 0 which contains the FileName
hgs
parents:
diff changeset
  1542
       of the target debug process.
hgs
parents:
diff changeset
  1543
*/
hgs
parents:
diff changeset
  1544
void CSecuritySvrSession::DetachProcessL(const RMessage2& aMessage)
hgs
parents:
diff changeset
  1545
	{
hgs
parents:
diff changeset
  1546
	LOG_MSG( "CSecuritySvrSession::DetachProcessL()\n" );
hgs
parents:
diff changeset
  1547
hgs
parents:
diff changeset
  1548
	TInt deslen = aMessage.GetDesLengthL(0);
hgs
parents:
diff changeset
  1549
	// Passed data will be saved in this descriptor.
hgs
parents:
diff changeset
  1550
	RBuf processName;
hgs
parents:
diff changeset
  1551
hgs
parents:
diff changeset
  1552
	// Max length set to the value of "deslen", but current length is zero
hgs
parents:
diff changeset
  1553
	processName.CreateL(deslen);
hgs
parents:
diff changeset
  1554
hgs
parents:
diff changeset
  1555
	// Do the right cleanup if anything subsequently goes wrong
hgs
parents:
diff changeset
  1556
	processName.CleanupClosePushL();
hgs
parents:
diff changeset
  1557
hgs
parents:
diff changeset
  1558
	// Copy the client's descriptor data into our buffer.
hgs
parents:
diff changeset
  1559
	aMessage.ReadL(0,processName);
hgs
parents:
diff changeset
  1560
hgs
parents:
diff changeset
  1561
	User::LeaveIfError(Server().DetachProcess(processName, iDebugAgentProcessId));
hgs
parents:
diff changeset
  1562
hgs
parents:
diff changeset
  1563
	// Inform the kernel driver about the detachment, so that
hgs
parents:
diff changeset
  1564
	// it can stop tracking per-agent data for the debugged process.
hgs
parents:
diff changeset
  1565
	RBuf8 processName8;
hgs
parents:
diff changeset
  1566
hgs
parents:
diff changeset
  1567
	processName8.CreateL(deslen);
hgs
parents:
diff changeset
  1568
hgs
parents:
diff changeset
  1569
	processName8.CleanupClosePushL();
hgs
parents:
diff changeset
  1570
hgs
parents:
diff changeset
  1571
	processName8.Copy(processName);
hgs
parents:
diff changeset
  1572
hgs
parents:
diff changeset
  1573
	// Remove the Asynchronous Object associated with this process
hgs
parents:
diff changeset
  1574
	for(TInt i=0; i<iAsyncHandlers.Count(); i++)
hgs
parents:
diff changeset
  1575
		{
hgs
parents:
diff changeset
  1576
		if (processName8.Compare(iAsyncHandlers[i]->ProcessName()) == 0)
hgs
parents:
diff changeset
  1577
			{
hgs
parents:
diff changeset
  1578
			delete iAsyncHandlers[i];
hgs
parents:
diff changeset
  1579
			iAsyncHandlers.Remove(i);
hgs
parents:
diff changeset
  1580
hgs
parents:
diff changeset
  1581
			break;
hgs
parents:
diff changeset
  1582
			}
hgs
parents:
diff changeset
  1583
		}
hgs
parents:
diff changeset
  1584
	
hgs
parents:
diff changeset
  1585
	// Inform the driver that we are no longer attached to this process
hgs
parents:
diff changeset
  1586
	User::LeaveIfError(Server().iKernelDriver.DetachProcess(processName8,iDebugAgentProcessId.Id()));
hgs
parents:
diff changeset
  1587
	
hgs
parents:
diff changeset
  1588
	CleanupStack::PopAndDestroy(&processName8);
hgs
parents:
diff changeset
  1589
	CleanupStack::PopAndDestroy(&processName);
hgs
parents:
diff changeset
  1590
hgs
parents:
diff changeset
  1591
	aMessage.Complete(KErrNone);
hgs
parents:
diff changeset
  1592
	}
hgs
parents:
diff changeset
  1593
hgs
parents:
diff changeset
  1594
/**
hgs
parents:
diff changeset
  1595
Processes a DetachAll request from a debug agent.
hgs
parents:
diff changeset
  1596
The method sets completion status of the aMessage argument to 
hgs
parents:
diff changeset
  1597
KErrNone if successfully detached and to
hgs
parents:
diff changeset
  1598
another of the system wide error codes if there were problems.
hgs
parents:
diff changeset
  1599
hgs
parents:
diff changeset
  1600
@param aMessage contains:
hgs
parents:
diff changeset
  1601
       * a buffer at offset 0 which contains the FileName
hgs
parents:
diff changeset
  1602
       of the target debug process.
hgs
parents:
diff changeset
  1603
*/
hgs
parents:
diff changeset
  1604
void CSecuritySvrSession::DetachAllL(const RMessage2& aMessage)
hgs
parents:
diff changeset
  1605
	{
hgs
parents:
diff changeset
  1606
	LOG_MSG( "CSecuritySvrSession::DetachAllL()" );
hgs
parents:
diff changeset
  1607
hgs
parents:
diff changeset
  1608
	User::LeaveIfError(Server().DetachProcess(_L("*"), iDebugAgentProcessId));
hgs
parents:
diff changeset
  1609
hgs
parents:
diff changeset
  1610
	TBuf8<1> KStar8=_L8("*");
hgs
parents:
diff changeset
  1611
    
hgs
parents:
diff changeset
  1612
	TBool found = EFalse;
hgs
parents:
diff changeset
  1613
hgs
parents:
diff changeset
  1614
	// Remove the Asynchronous Object associated with the AttachAll, not the rest
hgs
parents:
diff changeset
  1615
	for(TInt i=0; i<iAsyncHandlers.Count(); i++)
hgs
parents:
diff changeset
  1616
		{
hgs
parents:
diff changeset
  1617
		if (iAsyncHandlers[i]->ProcessName().Compare(KStar8) == 0)
hgs
parents:
diff changeset
  1618
			{
hgs
parents:
diff changeset
  1619
			delete iAsyncHandlers[i];
hgs
parents:
diff changeset
  1620
			iAsyncHandlers.Remove(i);
hgs
parents:
diff changeset
  1621
			User::LeaveIfError(Server().iKernelDriver.DetachProcess(KStar8,iDebugAgentProcessId.Id()));
hgs
parents:
diff changeset
  1622
			found = ETrue;
hgs
parents:
diff changeset
  1623
			break;
hgs
parents:
diff changeset
  1624
			}
hgs
parents:
diff changeset
  1625
		}
hgs
parents:
diff changeset
  1626
hgs
parents:
diff changeset
  1627
	if( !found )
hgs
parents:
diff changeset
  1628
		{
hgs
parents:
diff changeset
  1629
		LOG_MSG2( "CSecuritySvrSession::DetachAllL() : Did not find the asynch handler for agent 0x%lx",
hgs
parents:
diff changeset
  1630
				iDebugAgentProcessId.Id() );
hgs
parents:
diff changeset
  1631
		User::Leave(KErrNotFound);
hgs
parents:
diff changeset
  1632
		}
hgs
parents:
diff changeset
  1633
hgs
parents:
diff changeset
  1634
	aMessage.Complete(KErrNone);
hgs
parents:
diff changeset
  1635
	}
hgs
parents:
diff changeset
  1636
hgs
parents:
diff changeset
  1637
/**
hgs
parents:
diff changeset
  1638
@param aMessage The RMessage2 object is expected to contain:
hgs
parents:
diff changeset
  1639
  * aMessage.Int0() - TDes8 Containing the process name.
hgs
parents:
diff changeset
  1640
  * aMessage.Int1() - Address of TPtr8 containing TEventInfo
hgs
parents:
diff changeset
  1641
hgs
parents:
diff changeset
  1642
*/
hgs
parents:
diff changeset
  1643
void CSecuritySvrSession::GetEventL(const RMessage2& aMessage)
hgs
parents:
diff changeset
  1644
	{
hgs
parents:
diff changeset
  1645
	LOG_MSG( "CSecuritySvrSession::GetEventL()\n" );
hgs
parents:
diff changeset
  1646
hgs
parents:
diff changeset
  1647
	// Local descriptor to contain target process name
hgs
parents:
diff changeset
  1648
	TInt deslen = aMessage.GetDesLengthL(0);
hgs
parents:
diff changeset
  1649
hgs
parents:
diff changeset
  1650
	RBuf processName;
hgs
parents:
diff changeset
  1651
hgs
parents:
diff changeset
  1652
	processName.CreateL(deslen);
hgs
parents:
diff changeset
  1653
	
hgs
parents:
diff changeset
  1654
	processName.CleanupClosePushL();
hgs
parents:
diff changeset
  1655
hgs
parents:
diff changeset
  1656
	// Read the target process name into processName
hgs
parents:
diff changeset
  1657
	aMessage.ReadL(0,processName);
hgs
parents:
diff changeset
  1658
hgs
parents:
diff changeset
  1659
	// Check if debug agent is attached to process
hgs
parents:
diff changeset
  1660
	if(!Server().CheckAttachedProcess(processName, aMessage, EFalse))
hgs
parents:
diff changeset
  1661
		{
hgs
parents:
diff changeset
  1662
		LOG_MSG("CSecuritySvrSession::GetEventL() - Not attached to this process\n");
hgs
parents:
diff changeset
  1663
hgs
parents:
diff changeset
  1664
		// Debug Agent is not attached at all to the requested process
hgs
parents:
diff changeset
  1665
		User::Leave(KErrPermissionDenied);
hgs
parents:
diff changeset
  1666
		}
hgs
parents:
diff changeset
  1667
hgs
parents:
diff changeset
  1668
	// Identify which process is being debugged, so that
hgs
parents:
diff changeset
  1669
	// we can locate the appropriate active object handler.
hgs
parents:
diff changeset
  1670
	RBuf8 processName8;
hgs
parents:
diff changeset
  1671
hgs
parents:
diff changeset
  1672
	processName8.CreateL(processName.Length());
hgs
parents:
diff changeset
  1673
hgs
parents:
diff changeset
  1674
	processName8.CleanupClosePushL();
hgs
parents:
diff changeset
  1675
hgs
parents:
diff changeset
  1676
	processName8.Copy(processName);
hgs
parents:
diff changeset
  1677
hgs
parents:
diff changeset
  1678
	// Find the Asynchronous Object associated with this process,
hgs
parents:
diff changeset
  1679
	// as it is permissible to have an outstanding GetEvent call
hgs
parents:
diff changeset
  1680
	// for each attached process.
hgs
parents:
diff changeset
  1681
	TBool foundHandler = EFalse;
hgs
parents:
diff changeset
  1682
	for(TInt i=0; i<iAsyncHandlers.Count(); i++)
hgs
parents:
diff changeset
  1683
		{
hgs
parents:
diff changeset
  1684
		if (processName8.Compare(iAsyncHandlers[i]->ProcessName()) == 0)
hgs
parents:
diff changeset
  1685
			{
hgs
parents:
diff changeset
  1686
			iAsyncHandlers[i]->GetEvent(aMessage);
hgs
parents:
diff changeset
  1687
			foundHandler = ETrue;
hgs
parents:
diff changeset
  1688
			break;
hgs
parents:
diff changeset
  1689
			}
hgs
parents:
diff changeset
  1690
		}
hgs
parents:
diff changeset
  1691
hgs
parents:
diff changeset
  1692
	if (foundHandler == EFalse)
hgs
parents:
diff changeset
  1693
		{
hgs
parents:
diff changeset
  1694
		// could not find an async handler object. Report the problem.
hgs
parents:
diff changeset
  1695
		LOG_MSG("CSecuritySvrSessionL - Could not find a handler object\n");
hgs
parents:
diff changeset
  1696
		User::Leave(KErrNotFound);
hgs
parents:
diff changeset
  1697
		}
hgs
parents:
diff changeset
  1698
hgs
parents:
diff changeset
  1699
	// Actually make the driver call, passing in the agent Id
hgs
parents:
diff changeset
  1700
	// so that the driver knows which per-agent event queue
hgs
parents:
diff changeset
  1701
	// to interrogate to retrieve the latest event.
hgs
parents:
diff changeset
  1702
	CleanupStack::PopAndDestroy(&processName8);
hgs
parents:
diff changeset
  1703
	CleanupStack::PopAndDestroy(&processName);
hgs
parents:
diff changeset
  1704
	}
hgs
parents:
diff changeset
  1705
hgs
parents:
diff changeset
  1706
/**
hgs
parents:
diff changeset
  1707
Cancels a pre-issued GetEvent call for a specific debugged process.
hgs
parents:
diff changeset
  1708
hgs
parents:
diff changeset
  1709
@param aMessage.Int0() - TDes8 containing aProcessName
hgs
parents:
diff changeset
  1710
*/
hgs
parents:
diff changeset
  1711
void CSecuritySvrSession::CancelGetEventL(const RMessage2& aMessage)
hgs
parents:
diff changeset
  1712
	{
hgs
parents:
diff changeset
  1713
	LOG_MSG( "CSecuritySvrSession::CancelGetEventL()\n" );
hgs
parents:
diff changeset
  1714
hgs
parents:
diff changeset
  1715
	// Local descriptor to contain target process name
hgs
parents:
diff changeset
  1716
	TInt deslen = aMessage.GetDesLengthL(0);
hgs
parents:
diff changeset
  1717
hgs
parents:
diff changeset
  1718
	RBuf processName;
hgs
parents:
diff changeset
  1719
hgs
parents:
diff changeset
  1720
	processName.CreateL(deslen);
hgs
parents:
diff changeset
  1721
hgs
parents:
diff changeset
  1722
	processName.CleanupClosePushL();
hgs
parents:
diff changeset
  1723
hgs
parents:
diff changeset
  1724
	// Read the target process name into processName
hgs
parents:
diff changeset
  1725
	aMessage.ReadL(0,processName,0);
hgs
parents:
diff changeset
  1726
hgs
parents:
diff changeset
  1727
	// Debug Agent is not an active debugger. Check if the DA is passively attached
hgs
parents:
diff changeset
  1728
	if(!Server().CheckAttachedProcess(processName, aMessage, EFalse))
hgs
parents:
diff changeset
  1729
		{
hgs
parents:
diff changeset
  1730
		// Debug Agent is not attached at all to the requested process
hgs
parents:
diff changeset
  1731
		User::Leave(KErrPermissionDenied);
hgs
parents:
diff changeset
  1732
		}
hgs
parents:
diff changeset
  1733
hgs
parents:
diff changeset
  1734
	// Identify the appropriate active object associate
hgs
parents:
diff changeset
  1735
	// with this process.
hgs
parents:
diff changeset
  1736
	RBuf8 processName8;
hgs
parents:
diff changeset
  1737
hgs
parents:
diff changeset
  1738
	processName8.CreateL(processName.Length());
hgs
parents:
diff changeset
  1739
hgs
parents:
diff changeset
  1740
	processName8.CleanupClosePushL();
hgs
parents:
diff changeset
  1741
hgs
parents:
diff changeset
  1742
	processName8.Copy(processName);
hgs
parents:
diff changeset
  1743
hgs
parents:
diff changeset
  1744
	// Find the Asynchronous Object associated with this process
hgs
parents:
diff changeset
  1745
	TBool foundHandler = EFalse;
hgs
parents:
diff changeset
  1746
	for(TInt i=0; i<iAsyncHandlers.Count(); i++)
hgs
parents:
diff changeset
  1747
		{
hgs
parents:
diff changeset
  1748
		if (processName8.Compare(iAsyncHandlers[i]->ProcessName()) == 0)
hgs
parents:
diff changeset
  1749
			{
hgs
parents:
diff changeset
  1750
hgs
parents:
diff changeset
  1751
			// Found the AO handler, so cancel the outstanding getevent call.
hgs
parents:
diff changeset
  1752
			iAsyncHandlers[i]->Cancel();
hgs
parents:
diff changeset
  1753
			foundHandler = ETrue;
hgs
parents:
diff changeset
  1754
			break;
hgs
parents:
diff changeset
  1755
			}
hgs
parents:
diff changeset
  1756
		}
hgs
parents:
diff changeset
  1757
hgs
parents:
diff changeset
  1758
	if(!foundHandler)
hgs
parents:
diff changeset
  1759
		{
hgs
parents:
diff changeset
  1760
		// We could not found a handler, so report the problem to the debug agent
hgs
parents:
diff changeset
  1761
		User::Leave(KErrNotFound);
hgs
parents:
diff changeset
  1762
		}
hgs
parents:
diff changeset
  1763
hgs
parents:
diff changeset
  1764
	//do cleanup
hgs
parents:
diff changeset
  1765
	CleanupStack::PopAndDestroy(&processName8);
hgs
parents:
diff changeset
  1766
	CleanupStack::PopAndDestroy(&processName);
hgs
parents:
diff changeset
  1767
hgs
parents:
diff changeset
  1768
	aMessage.Complete(KErrNone);
hgs
parents:
diff changeset
  1769
	}
hgs
parents:
diff changeset
  1770
hgs
parents:
diff changeset
  1771
/*
hgs
parents:
diff changeset
  1772
 Purpose: Sets the required event action to be taken for a specific
hgs
parents:
diff changeset
  1773
 process and event combination
hgs
parents:
diff changeset
  1774
hgs
parents:
diff changeset
  1775
@param aMessage The RMessage2 object is expected to contain:
hgs
parents:
diff changeset
  1776
  * aMessage.Int0() - TDes8 Containing the process name.
hgs
parents:
diff changeset
  1777
  * aMessage.Int1() - TEventType
hgs
parents:
diff changeset
  1778
  * aMessage.Int2() - TKernelEventAction
hgs
parents:
diff changeset
  1779
  *
hgs
parents:
diff changeset
  1780
*/
hgs
parents:
diff changeset
  1781
void CSecuritySvrSession::SetEventActionL(const RMessage2& aMessage)
hgs
parents:
diff changeset
  1782
	{
hgs
parents:
diff changeset
  1783
	LOG_MSG( "CSecuritySvrSession::SetEventActionL()\n" );
hgs
parents:
diff changeset
  1784
hgs
parents:
diff changeset
  1785
	// Local descriptor to contain target process name
hgs
parents:
diff changeset
  1786
	TInt deslen = aMessage.GetDesLengthL(0);
hgs
parents:
diff changeset
  1787
hgs
parents:
diff changeset
  1788
	RBuf processName;
hgs
parents:
diff changeset
  1789
hgs
parents:
diff changeset
  1790
	processName.CreateL(deslen);
hgs
parents:
diff changeset
  1791
hgs
parents:
diff changeset
  1792
	processName.CleanupClosePushL();
hgs
parents:
diff changeset
  1793
hgs
parents:
diff changeset
  1794
	// Read the target process name into processName
hgs
parents:
diff changeset
  1795
	aMessage.ReadL(0,processName);
hgs
parents:
diff changeset
  1796
hgs
parents:
diff changeset
  1797
	//check that the agent has attached to the target process
hgs
parents:
diff changeset
  1798
	if(!Server().CheckAttachedProcess(processName, aMessage, EFalse))
hgs
parents:
diff changeset
  1799
		{
hgs
parents:
diff changeset
  1800
		// Debug Agent is not attached at all to the requested process
hgs
parents:
diff changeset
  1801
		User::Leave(KErrPermissionDenied);
hgs
parents:
diff changeset
  1802
		}
hgs
parents:
diff changeset
  1803
hgs
parents:
diff changeset
  1804
	// Extract and validate the arguments from aMessage
hgs
parents:
diff changeset
  1805
	TUint32 event  = aMessage.Int1();
hgs
parents:
diff changeset
  1806
	if (event >= EEventsLast)
hgs
parents:
diff changeset
  1807
		{
hgs
parents:
diff changeset
  1808
		// Supplied event Id was not recognised
hgs
parents:
diff changeset
  1809
		User::Leave(KErrArgument);
hgs
parents:
diff changeset
  1810
		}
hgs
parents:
diff changeset
  1811
hgs
parents:
diff changeset
  1812
	TUint32 action = aMessage.Int2();
hgs
parents:
diff changeset
  1813
	if(action >= EActionLast)
hgs
parents:
diff changeset
  1814
	{
hgs
parents:
diff changeset
  1815
		// Supplied event action was not recognised
hgs
parents:
diff changeset
  1816
		User::Leave(KErrArgument);
hgs
parents:
diff changeset
  1817
	}
hgs
parents:
diff changeset
  1818
hgs
parents:
diff changeset
  1819
	RBuf8 processName8;
hgs
parents:
diff changeset
  1820
hgs
parents:
diff changeset
  1821
	processName8.CreateL(processName.Length());
hgs
parents:
diff changeset
  1822
hgs
parents:
diff changeset
  1823
	processName8.CleanupClosePushL();
hgs
parents:
diff changeset
  1824
hgs
parents:
diff changeset
  1825
	processName8.Copy(processName);
hgs
parents:
diff changeset
  1826
hgs
parents:
diff changeset
  1827
	// Make the call to the device driver
hgs
parents:
diff changeset
  1828
	TInt err = Server().iKernelDriver.SetEventAction(processName8, \
hgs
parents:
diff changeset
  1829
		(TEventType)event,\
hgs
parents:
diff changeset
  1830
		(TKernelEventAction)action,\
hgs
parents:
diff changeset
  1831
		iDebugAgentProcessId.Id());
hgs
parents:
diff changeset
  1832
hgs
parents:
diff changeset
  1833
	User::LeaveIfError(err);
hgs
parents:
diff changeset
  1834
hgs
parents:
diff changeset
  1835
	CleanupStack::PopAndDestroy(&processName8);
hgs
parents:
diff changeset
  1836
	CleanupStack::PopAndDestroy(&processName);
hgs
parents:
diff changeset
  1837
hgs
parents:
diff changeset
  1838
	aMessage.Complete(KErrNone);
hgs
parents:
diff changeset
  1839
}
hgs
parents:
diff changeset
  1840
hgs
parents:
diff changeset
  1841
/**
hgs
parents:
diff changeset
  1842
Purpose: Single-step a thread for a specified number of instructions
hgs
parents:
diff changeset
  1843
hgs
parents:
diff changeset
  1844
@param aMessage.Ptr0() - Thread Id of the thread to be stepped
hgs
parents:
diff changeset
  1845
@param aMessage.Int1() - Number of instructions to step.
hgs
parents:
diff changeset
  1846
hgs
parents:
diff changeset
  1847
@leave one of the system wide error codes
hgs
parents:
diff changeset
  1848
hgs
parents:
diff changeset
  1849
*/
hgs
parents:
diff changeset
  1850
void CSecuritySvrSession::StepL(const RMessage2& aMessage)
hgs
parents:
diff changeset
  1851
	{
hgs
parents:
diff changeset
  1852
	LOG_MSG( "CSecuritySvrSession::StepL()\n" );
hgs
parents:
diff changeset
  1853
hgs
parents:
diff changeset
  1854
	const TThreadId threadId = ReadTThreadIdL(aMessage, 0);
hgs
parents:
diff changeset
  1855
	const TInt32 numSteps = aMessage.Int1();
hgs
parents:
diff changeset
  1856
hgs
parents:
diff changeset
  1857
	CheckAttachedL(threadId, aMessage, EFalse);
hgs
parents:
diff changeset
  1858
hgs
parents:
diff changeset
  1859
	User::LeaveIfError(Server().iKernelDriver.Step( threadId, numSteps ));
hgs
parents:
diff changeset
  1860
hgs
parents:
diff changeset
  1861
	aMessage.Complete(KErrNone);
hgs
parents:
diff changeset
  1862
	}
hgs
parents:
diff changeset
  1863
hgs
parents:
diff changeset
  1864
/**
hgs
parents:
diff changeset
  1865
 * This checks whether or not the agent is permitted access to the flash partition
hgs
parents:
diff changeset
  1866
 * @return KErrNone if allowed, otherwise one of the system wide error codes
hgs
parents:
diff changeset
  1867
 * @leave one of the system wide error codes
hgs
parents:
diff changeset
  1868
 */
hgs
parents:
diff changeset
  1869
TInt CSecuritySvrSession::CheckFlashAccessPermissionL(const RThread& aClientThread)
hgs
parents:
diff changeset
  1870
	{
hgs
parents:
diff changeset
  1871
	// Read the OEM Debug token capabilities (if any)
hgs
parents:
diff changeset
  1872
	GetDebugAgentOEMTokenCapsL();
hgs
parents:
diff changeset
  1873
	
hgs
parents:
diff changeset
  1874
	if(Server().OEMTokenPermitsFlashAccessL((iOEMDebugCapabilities)))
hgs
parents:
diff changeset
  1875
		{
hgs
parents:
diff changeset
  1876
		return KErrNone;
hgs
parents:
diff changeset
  1877
		}
hgs
parents:
diff changeset
  1878
hgs
parents:
diff changeset
  1879
	return KErrPermissionDenied;
hgs
parents:
diff changeset
  1880
	}
hgs
parents:
diff changeset
  1881
hgs
parents:
diff changeset
  1882
/**
hgs
parents:
diff changeset
  1883
Purpose: Read the crash log from the crash flash partition
hgs
parents:
diff changeset
  1884
@param aMessage.Int0() - Position to read from.
hgs
parents:
diff changeset
  1885
@param aMessage.Ptr1() - Buffer to hold the data retrieved
hgs
parents:
diff changeset
  1886
@param aMessage.Int2() - Size of the data to read.
hgs
parents:
diff changeset
  1887
hgs
parents:
diff changeset
  1888
@leave one of the system wide error codes
hgs
parents:
diff changeset
  1889
*/
hgs
parents:
diff changeset
  1890
void CSecuritySvrSession::ReadCrashLogL (const RMessage2& aMessage)
hgs
parents:
diff changeset
  1891
	{	
hgs
parents:
diff changeset
  1892
	//get the debug agent's thread and push handle onto clean up stack
hgs
parents:
diff changeset
  1893
	RThread clientThread;
hgs
parents:
diff changeset
  1894
	User::LeaveIfError(aMessage.Client(clientThread));
hgs
parents:
diff changeset
  1895
	CleanupClosePushL(clientThread);
hgs
parents:
diff changeset
  1896
	
hgs
parents:
diff changeset
  1897
	TInt err = CheckFlashAccessPermissionL(clientThread);
hgs
parents:
diff changeset
  1898
	
hgs
parents:
diff changeset
  1899
	CleanupStack::PopAndDestroy(&clientThread);
hgs
parents:
diff changeset
  1900
	
hgs
parents:
diff changeset
  1901
	if(KErrNone != err)
hgs
parents:
diff changeset
  1902
		{
hgs
parents:
diff changeset
  1903
		LOG_MSG2( "CSecuritySvrSession::ReadCrashLogL()  Access Not Granted - [%d]\n", err );
hgs
parents:
diff changeset
  1904
		aMessage.Complete(err);
hgs
parents:
diff changeset
  1905
		return;
hgs
parents:
diff changeset
  1906
		}
hgs
parents:
diff changeset
  1907
	
hgs
parents:
diff changeset
  1908
	//Check whether drive connected.
hgs
parents:
diff changeset
  1909
	if(!iCrashConnected)
hgs
parents:
diff changeset
  1910
		ConnectCrashPartitionL();	
hgs
parents:
diff changeset
  1911
hgs
parents:
diff changeset
  1912
	TInt readPosition = aMessage.Int0(); //read position
hgs
parents:
diff changeset
  1913
	
hgs
parents:
diff changeset
  1914
	TInt readSize = aMessage.Int2(); //read size
hgs
parents:
diff changeset
  1915
	
hgs
parents:
diff changeset
  1916
	RBuf8 readBuf;
hgs
parents:
diff changeset
  1917
	readBuf.CreateL(readSize);
hgs
parents:
diff changeset
  1918
	readBuf.CleanupClosePushL();
hgs
parents:
diff changeset
  1919
	
hgs
parents:
diff changeset
  1920
	err = iLocalDrive.Read (readPosition, readSize, readBuf);
hgs
parents:
diff changeset
  1921
	
hgs
parents:
diff changeset
  1922
	//write the list data back
hgs
parents:
diff changeset
  1923
	aMessage.WriteL (1, readBuf);	
hgs
parents:
diff changeset
  1924
	
hgs
parents:
diff changeset
  1925
	CleanupStack::PopAndDestroy (&readBuf);	
hgs
parents:
diff changeset
  1926
	
hgs
parents:
diff changeset
  1927
	//Complete message
hgs
parents:
diff changeset
  1928
	aMessage.Complete(err);	
hgs
parents:
diff changeset
  1929
	}
hgs
parents:
diff changeset
  1930
/**
hgs
parents:
diff changeset
  1931
Purpose: Function to write the crash config to the crash flash partition
hgs
parents:
diff changeset
  1932
hgs
parents:
diff changeset
  1933
@param aMessage.Int0() - write position in bytes from start position in flash partition.
hgs
parents:
diff changeset
  1934
@param aMessage.Ptr1() - Buffer containing the data to be written onto the flash. 
hgs
parents:
diff changeset
  1935
                         The size could be 0 if only flash partition size is needed. 
hgs
parents:
diff changeset
  1936
@param aMessage.Int2() - returns the size of the flash partition.
hgs
parents:
diff changeset
  1937
hgs
parents:
diff changeset
  1938
@leave one of the system wide error codes
hgs
parents:
diff changeset
  1939
*/
hgs
parents:
diff changeset
  1940
void CSecuritySvrSession::WriteCrashConfigL(const RMessage2& aMessage)
hgs
parents:
diff changeset
  1941
	{
hgs
parents:
diff changeset
  1942
	LOG_MSG( "CSecuritySvrSession::WriteCrashConfigL()\n" );
hgs
parents:
diff changeset
  1943
	
hgs
parents:
diff changeset
  1944
	//get the debug agent's thread and push handle onto clean up stack
hgs
parents:
diff changeset
  1945
	RThread clientThread;
hgs
parents:
diff changeset
  1946
	User::LeaveIfError(aMessage.Client(clientThread));
hgs
parents:
diff changeset
  1947
	CleanupClosePushL(clientThread);
hgs
parents:
diff changeset
  1948
	
hgs
parents:
diff changeset
  1949
	TInt err = CheckFlashAccessPermissionL(clientThread);
hgs
parents:
diff changeset
  1950
	
hgs
parents:
diff changeset
  1951
	CleanupStack::PopAndDestroy(&clientThread);
hgs
parents:
diff changeset
  1952
	
hgs
parents:
diff changeset
  1953
	if(KErrNone != err)
hgs
parents:
diff changeset
  1954
		{
hgs
parents:
diff changeset
  1955
		LOG_MSG2( "CSecuritySvrSession::WriteCrashConfigL()  Access Not Granted - [%d]\n", err );
hgs
parents:
diff changeset
  1956
		aMessage.Complete(err);
hgs
parents:
diff changeset
  1957
		return;
hgs
parents:
diff changeset
  1958
		}
hgs
parents:
diff changeset
  1959
	
hgs
parents:
diff changeset
  1960
	//Check whether drive connected.
hgs
parents:
diff changeset
  1961
	if(!iCrashConnected)
hgs
parents:
diff changeset
  1962
		ConnectCrashPartitionL();	
hgs
parents:
diff changeset
  1963
	
hgs
parents:
diff changeset
  1964
	// Get the length of the buffer
hgs
parents:
diff changeset
  1965
	TInt deslen = aMessage.GetDesLengthL(1);
hgs
parents:
diff changeset
  1966
hgs
parents:
diff changeset
  1967
	RBuf8 dataBuf;
hgs
parents:
diff changeset
  1968
	dataBuf.CreateL(deslen);
hgs
parents:
diff changeset
  1969
	dataBuf.CleanupClosePushL();
hgs
parents:
diff changeset
  1970
hgs
parents:
diff changeset
  1971
	// data to be written to flash
hgs
parents:
diff changeset
  1972
	aMessage.ReadL(1,dataBuf);
hgs
parents:
diff changeset
  1973
	
hgs
parents:
diff changeset
  1974
	TUint32 position = aMessage.Int0(); //position to start from
hgs
parents:
diff changeset
  1975
		
hgs
parents:
diff changeset
  1976
	err = iLocalDrive.Write(position,(const TDesC8&)dataBuf);
hgs
parents:
diff changeset
  1977
	
hgs
parents:
diff changeset
  1978
	TPtr8 dataSize((TUint8*)&deslen,4, 4);
hgs
parents:
diff changeset
  1979
	
hgs
parents:
diff changeset
  1980
	//write the size of the data written back
hgs
parents:
diff changeset
  1981
	aMessage.WriteL(2,dataSize);
hgs
parents:
diff changeset
  1982
		
hgs
parents:
diff changeset
  1983
	//destroy buffer
hgs
parents:
diff changeset
  1984
	CleanupStack::PopAndDestroy(&dataBuf); 
hgs
parents:
diff changeset
  1985
	
hgs
parents:
diff changeset
  1986
	aMessage.Complete(err);	
hgs
parents:
diff changeset
  1987
	}
hgs
parents:
diff changeset
  1988
/**
hgs
parents:
diff changeset
  1989
Purpose: Method to erase the crash flash block
hgs
parents:
diff changeset
  1990
hgs
parents:
diff changeset
  1991
@param aMessage.Int0() - write position in bytes from start position in flash partition.
hgs
parents:
diff changeset
  1992
@param aMessage.Int2() - Number of blocks to erase.
hgs
parents:
diff changeset
  1993
hgs
parents:
diff changeset
  1994
@leave one of the system wide error codes
hgs
parents:
diff changeset
  1995
*/
hgs
parents:
diff changeset
  1996
hgs
parents:
diff changeset
  1997
void CSecuritySvrSession::EraseCrashLogL(const RMessage2& aMessage)
hgs
parents:
diff changeset
  1998
	{	
hgs
parents:
diff changeset
  1999
	LOG_MSG( "CSecuritySvrSession::EraseCrashLogL()\n" );
hgs
parents:
diff changeset
  2000
	
hgs
parents:
diff changeset
  2001
	//get the debug agent's thread and push handle onto clean up stack
hgs
parents:
diff changeset
  2002
	RThread clientThread;
hgs
parents:
diff changeset
  2003
	User::LeaveIfError(aMessage.Client(clientThread));
hgs
parents:
diff changeset
  2004
	CleanupClosePushL(clientThread);
hgs
parents:
diff changeset
  2005
	
hgs
parents:
diff changeset
  2006
	TInt err = CheckFlashAccessPermissionL(clientThread);
hgs
parents:
diff changeset
  2007
	
hgs
parents:
diff changeset
  2008
	CleanupStack::PopAndDestroy(&clientThread);
hgs
parents:
diff changeset
  2009
	
hgs
parents:
diff changeset
  2010
	if(KErrNone != err)
hgs
parents:
diff changeset
  2011
		{
hgs
parents:
diff changeset
  2012
		LOG_MSG2( "CSecuritySvrSession::EraseCrashLogL()  Access Not Granted - [%d]\n", err );
hgs
parents:
diff changeset
  2013
		aMessage.Complete(err);
hgs
parents:
diff changeset
  2014
		return;
hgs
parents:
diff changeset
  2015
		}
hgs
parents:
diff changeset
  2016
			
hgs
parents:
diff changeset
  2017
	//Check whether drive connected.
hgs
parents:
diff changeset
  2018
	if(!iCrashConnected)
hgs
parents:
diff changeset
  2019
		ConnectCrashPartitionL();	
hgs
parents:
diff changeset
  2020
	
hgs
parents:
diff changeset
  2021
	TInt64 position = aMessage.Int0();	
hgs
parents:
diff changeset
  2022
	TInt size = aMessage.Int1();
hgs
parents:
diff changeset
  2023
	
hgs
parents:
diff changeset
  2024
	//Format drive
hgs
parents:
diff changeset
  2025
	err = iLocalDrive.Format(position,size*iCaps.iEraseBlockSize);		
hgs
parents:
diff changeset
  2026
 
hgs
parents:
diff changeset
  2027
	aMessage.Complete(err);	
hgs
parents:
diff changeset
  2028
	}
hgs
parents:
diff changeset
  2029
hgs
parents:
diff changeset
  2030
/**
hgs
parents:
diff changeset
  2031
Purpose: Method to erase the entire crash flash block
hgs
parents:
diff changeset
  2032
@leave one of the system wide error codes
hgs
parents:
diff changeset
  2033
*/
hgs
parents:
diff changeset
  2034
hgs
parents:
diff changeset
  2035
void CSecuritySvrSession::EraseEntireCrashLogL(const RMessage2& aMessage)
hgs
parents:
diff changeset
  2036
	{
hgs
parents:
diff changeset
  2037
	LOG_MSG( "CSecuritySvrSession::EraseEntireCrashLogL()\n" );
hgs
parents:
diff changeset
  2038
	
hgs
parents:
diff changeset
  2039
	//get the debug agent's thread and push handle onto clean up stack
hgs
parents:
diff changeset
  2040
	RThread clientThread;
hgs
parents:
diff changeset
  2041
	User::LeaveIfError(aMessage.Client(clientThread));
hgs
parents:
diff changeset
  2042
	CleanupClosePushL(clientThread);
hgs
parents:
diff changeset
  2043
	
hgs
parents:
diff changeset
  2044
	TInt err = CheckFlashAccessPermissionL(clientThread);
hgs
parents:
diff changeset
  2045
	
hgs
parents:
diff changeset
  2046
	CleanupStack::PopAndDestroy(&clientThread);
hgs
parents:
diff changeset
  2047
	
hgs
parents:
diff changeset
  2048
	if(KErrNone != err)
hgs
parents:
diff changeset
  2049
		{
hgs
parents:
diff changeset
  2050
		LOG_MSG2( "CSecuritySvrSession::EraseEntireCrashLogL()  Access Not Granted - [%d]\n", err );
hgs
parents:
diff changeset
  2051
		aMessage.Complete(err);
hgs
parents:
diff changeset
  2052
		return;
hgs
parents:
diff changeset
  2053
		}	
hgs
parents:
diff changeset
  2054
	
hgs
parents:
diff changeset
  2055
	//Check whether drive connected.
hgs
parents:
diff changeset
  2056
	if(!iCrashConnected)
hgs
parents:
diff changeset
  2057
		ConnectCrashPartitionL();
hgs
parents:
diff changeset
  2058
	
hgs
parents:
diff changeset
  2059
	TUint numberBlocks = iCaps.iSize /iCaps.iEraseBlockSize;
hgs
parents:
diff changeset
  2060
	
hgs
parents:
diff changeset
  2061
	//Format drive
hgs
parents:
diff changeset
  2062
	for(TInt i = 0; i < numberBlocks; i++)
hgs
parents:
diff changeset
  2063
		{
hgs
parents:
diff changeset
  2064
		err = iLocalDrive.Format(i*iCaps.iEraseBlockSize,iCaps.iEraseBlockSize);
hgs
parents:
diff changeset
  2065
		if(KErrNone != err)
hgs
parents:
diff changeset
  2066
			{
hgs
parents:
diff changeset
  2067
			RDebug::Printf("err = %d", err);
hgs
parents:
diff changeset
  2068
			aMessage.Complete(err);
hgs
parents:
diff changeset
  2069
			return;
hgs
parents:
diff changeset
  2070
			}
hgs
parents:
diff changeset
  2071
		}
hgs
parents:
diff changeset
  2072
	
hgs
parents:
diff changeset
  2073
	
hgs
parents:
diff changeset
  2074
	aMessage.Complete(err);
hgs
parents:
diff changeset
  2075
	}
hgs
parents:
diff changeset
  2076
hgs
parents:
diff changeset
  2077
hgs
parents:
diff changeset
  2078
/**
hgs
parents:
diff changeset
  2079
Purpose: Kill a specified process
hgs
parents:
diff changeset
  2080
hgs
parents:
diff changeset
  2081
@param aMessage.Ptr0() - Process Id of the thread to be stepped
hgs
parents:
diff changeset
  2082
@param aMessage.Int1() - Reason code to supply when killing the process.
hgs
parents:
diff changeset
  2083
hgs
parents:
diff changeset
  2084
@leave one of the system wide error codes
hgs
parents:
diff changeset
  2085
hgs
parents:
diff changeset
  2086
*/
hgs
parents:
diff changeset
  2087
void CSecuritySvrSession::KillProcessL(const RMessage2& aMessage)
hgs
parents:
diff changeset
  2088
	{
hgs
parents:
diff changeset
  2089
	LOG_MSG( "CSecuritySvrSession::KillProcessL()\n" );
hgs
parents:
diff changeset
  2090
hgs
parents:
diff changeset
  2091
	const TProcessId processId = ReadTProcessIdL(aMessage, 0);
hgs
parents:
diff changeset
  2092
	const TInt32 reason = aMessage.Int1();
hgs
parents:
diff changeset
  2093
hgs
parents:
diff changeset
  2094
	CheckAttachedL(processId, aMessage, EFalse);
hgs
parents:
diff changeset
  2095
hgs
parents:
diff changeset
  2096
	User::LeaveIfError(Server().iKernelDriver.KillProcess( processId, reason ));
hgs
parents:
diff changeset
  2097
hgs
parents:
diff changeset
  2098
	aMessage.Complete(KErrNone);
hgs
parents:
diff changeset
  2099
	}
hgs
parents:
diff changeset
  2100
hgs
parents:
diff changeset
  2101
/** Gets the secure id of aFileName
hgs
parents:
diff changeset
  2102
  @param aFileName file name of executable to get SID for
hgs
parents:
diff changeset
  2103
  @param aSecureId on return will contain the SID of aFileName
hgs
parents:
diff changeset
  2104
hgs
parents:
diff changeset
  2105
  @leave one of the system wide error codes
hgs
parents:
diff changeset
  2106
  */
hgs
parents:
diff changeset
  2107
void CSecuritySvrSession::GetSecureIdL(const TDesC& aFileName, TUid& aSecureId)
hgs
parents:
diff changeset
  2108
	{
hgs
parents:
diff changeset
  2109
	RFs fs;
hgs
parents:
diff changeset
  2110
	User::LeaveIfError(fs.Connect());
hgs
parents:
diff changeset
  2111
	CleanupClosePushL(fs);
hgs
parents:
diff changeset
  2112
hgs
parents:
diff changeset
  2113
	RFile targetExe;
hgs
parents:
diff changeset
  2114
	OpenFileHandleL(aFileName, fs, targetExe);
hgs
parents:
diff changeset
  2115
	CleanupClosePushL(targetExe);
hgs
parents:
diff changeset
  2116
hgs
parents:
diff changeset
  2117
	// Read in the entire header
hgs
parents:
diff changeset
  2118
	RBuf8 e32HdrBuf;
hgs
parents:
diff changeset
  2119
	e32HdrBuf.CreateL(RLibrary::KRequiredImageHeaderSize);
hgs
parents:
diff changeset
  2120
	e32HdrBuf.CleanupClosePushL();
hgs
parents:
diff changeset
  2121
hgs
parents:
diff changeset
  2122
	// Read the entire header as far as possible
hgs
parents:
diff changeset
  2123
	TInt err = targetExe.Read(e32HdrBuf);
hgs
parents:
diff changeset
  2124
	if (err != KErrNone)
hgs
parents:
diff changeset
  2125
		{
hgs
parents:
diff changeset
  2126
		// Could not read the file 
hgs
parents:
diff changeset
  2127
		LOG_MSG("CSecuritySvrSession::GetSecureIdL - Failed to read executable\n");
hgs
parents:
diff changeset
  2128
hgs
parents:
diff changeset
  2129
		User::Leave(err);
hgs
parents:
diff changeset
  2130
		}
hgs
parents:
diff changeset
  2131
hgs
parents:
diff changeset
  2132
	if(!CheckSufficientData(e32HdrBuf, IsExecutableXipL(targetExe)))
hgs
parents:
diff changeset
  2133
		{
hgs
parents:
diff changeset
  2134
		User::Leave(KErrGeneral);
hgs
parents:
diff changeset
  2135
		}
hgs
parents:
diff changeset
  2136
hgs
parents:
diff changeset
  2137
	aSecureId = GetSecureIdL(e32HdrBuf, IsExecutableXipL(targetExe));
hgs
parents:
diff changeset
  2138
hgs
parents:
diff changeset
  2139
	CleanupStack::PopAndDestroy(3, &fs);
hgs
parents:
diff changeset
  2140
	}
hgs
parents:
diff changeset
  2141
hgs
parents:
diff changeset
  2142
/** Get the secure id from aHeaderData
hgs
parents:
diff changeset
  2143
  @param aHeaderData an executable's header data to read SID from
hgs
parents:
diff changeset
  2144
  @param aXip indication of whether the header data is from an XIP file
hgs
parents:
diff changeset
  2145
hgs
parents:
diff changeset
  2146
  @return secure ID from aHeaderData
hgs
parents:
diff changeset
  2147
  */
hgs
parents:
diff changeset
  2148
TUid CSecuritySvrSession::GetSecureIdL(const TDesC8& aHeaderData, TBool aXip)
hgs
parents:
diff changeset
  2149
	{
hgs
parents:
diff changeset
  2150
	if(!CheckSufficientData(aHeaderData, aXip))
hgs
parents:
diff changeset
  2151
		{
hgs
parents:
diff changeset
  2152
		User::Leave(KErrGeneral);
hgs
parents:
diff changeset
  2153
		}
hgs
parents:
diff changeset
  2154
hgs
parents:
diff changeset
  2155
	if (aXip)
hgs
parents:
diff changeset
  2156
		{
hgs
parents:
diff changeset
  2157
		TRomImageHeader* hdr = (TRomImageHeader*)aHeaderData.Ptr();
hgs
parents:
diff changeset
  2158
		return TUid::Uid(hdr->iS.iSecureId);
hgs
parents:
diff changeset
  2159
		}
hgs
parents:
diff changeset
  2160
	else
hgs
parents:
diff changeset
  2161
		{
hgs
parents:
diff changeset
  2162
		// it is an epoc32 image
hgs
parents:
diff changeset
  2163
		E32ImageHeaderV* hdr = (E32ImageHeaderV*)aHeaderData.Ptr();
hgs
parents:
diff changeset
  2164
		return TUid::Uid(hdr->iS.iSecureId);
hgs
parents:
diff changeset
  2165
		}
hgs
parents:
diff changeset
  2166
	}
hgs
parents:
diff changeset
  2167
hgs
parents:
diff changeset
  2168
/**
hgs
parents:
diff changeset
  2169
@param aMessage contains:
hgs
parents:
diff changeset
  2170
 * aMessage.Ptr0() a TListDetails object
hgs
parents:
diff changeset
  2171
 * aMessage.Ptr1() a client supplied TDes8 for the driver to return data in
hgs
parents:
diff changeset
  2172
 * aMessage.Ptr2() a TUint32 for the driver to return the size of the requested listing's data in
hgs
parents:
diff changeset
  2173
hgs
parents:
diff changeset
  2174
@leave KErrTooBig if the buffer passed as argument 1 of aMessage is too
hgs
parents:
diff changeset
  2175
       small to contain the requested data,
hgs
parents:
diff changeset
  2176
       KErrNoMemory if a temporary buffer could not be allocated,
hgs
parents:
diff changeset
  2177
       or one of the other system wide error codes
hgs
parents:
diff changeset
  2178
*/
hgs
parents:
diff changeset
  2179
void CSecuritySvrSession::GetListL(const RMessage2& aMessage)
hgs
parents:
diff changeset
  2180
	{
hgs
parents:
diff changeset
  2181
	LOG_MSG("CSecuritySvrSession::GetListL()");
hgs
parents:
diff changeset
  2182
hgs
parents:
diff changeset
  2183
	// buffer to write list data into before copying back to agent
hgs
parents:
diff changeset
  2184
	RBuf8 listDetailsBuf;
hgs
parents:
diff changeset
  2185
hgs
parents:
diff changeset
  2186
	//allocate buffer
hgs
parents:
diff changeset
  2187
	listDetailsBuf.CreateL(sizeof(TListDetails));
hgs
parents:
diff changeset
  2188
hgs
parents:
diff changeset
  2189
	// Do the right cleanup if anything subsequently goes wrong
hgs
parents:
diff changeset
  2190
	listDetailsBuf.CleanupClosePushL();
hgs
parents:
diff changeset
  2191
hgs
parents:
diff changeset
  2192
	//read the data from the client thread
hgs
parents:
diff changeset
  2193
	aMessage.ReadL(0, listDetailsBuf);
hgs
parents:
diff changeset
  2194
	TListDetails* listDetails = (TListDetails*)listDetailsBuf.Ptr();
hgs
parents:
diff changeset
  2195
hgs
parents:
diff changeset
  2196
	//get the type of list requested
hgs
parents:
diff changeset
  2197
	TListId type = (TListId)aMessage.Int0();
hgs
parents:
diff changeset
  2198
hgs
parents:
diff changeset
  2199
	//create a buffer to store the data in
hgs
parents:
diff changeset
  2200
	RBuf8 buffer;
hgs
parents:
diff changeset
  2201
	buffer.CreateL(aMessage.GetDesMaxLength(1));
hgs
parents:
diff changeset
  2202
	buffer.CleanupClosePushL();
hgs
parents:
diff changeset
  2203
hgs
parents:
diff changeset
  2204
	//create a temporary variable to potentially store data length in
hgs
parents:
diff changeset
  2205
	TUint32 size = 0;
hgs
parents:
diff changeset
  2206
hgs
parents:
diff changeset
  2207
	TInt err = KErrNone;
hgs
parents:
diff changeset
  2208
hgs
parents:
diff changeset
  2209
	// the executables list is generated in the DSS rather than in the driver
hgs
parents:
diff changeset
  2210
	// so is treated separately
hgs
parents:
diff changeset
  2211
	if(listDetails->iListId == EExecutables)
hgs
parents:
diff changeset
  2212
		{
hgs
parents:
diff changeset
  2213
		if(listDetails->iListScope != EScopeGlobal)
hgs
parents:
diff changeset
  2214
			{
hgs
parents:
diff changeset
  2215
			User::Leave(KErrArgument);
hgs
parents:
diff changeset
  2216
			}
hgs
parents:
diff changeset
  2217
		if(listDetails->iTargetId != 0)
hgs
parents:
diff changeset
  2218
			{
hgs
parents:
diff changeset
  2219
			User::Leave(KErrArgument);
hgs
parents:
diff changeset
  2220
			}
hgs
parents:
diff changeset
  2221
		err = GetExecutablesListL(buffer, size);
hgs
parents:
diff changeset
  2222
		}
hgs
parents:
diff changeset
  2223
	else
hgs
parents:
diff changeset
  2224
		{
hgs
parents:
diff changeset
  2225
		err = Server().iKernelDriver.GetList(listDetails->iListId, listDetails->iListScope, listDetails->iTargetId, iDebugAgentProcessId, buffer, size);
hgs
parents:
diff changeset
  2226
		}
hgs
parents:
diff changeset
  2227
hgs
parents:
diff changeset
  2228
	if(err == KErrNone)
hgs
parents:
diff changeset
  2229
		{
hgs
parents:
diff changeset
  2230
		//write the list data back
hgs
parents:
diff changeset
  2231
		aMessage.WriteL(1, buffer);
hgs
parents:
diff changeset
  2232
		}
hgs
parents:
diff changeset
  2233
hgs
parents:
diff changeset
  2234
	TPtr8 sizePtr((TUint8*)&size, sizeof(TUint32), sizeof(TUint32));
hgs
parents:
diff changeset
  2235
	//write size back to agent
hgs
parents:
diff changeset
  2236
	aMessage.WriteL(2, sizePtr);
hgs
parents:
diff changeset
  2237
hgs
parents:
diff changeset
  2238
	CleanupStack::PopAndDestroy(&buffer);
hgs
parents:
diff changeset
  2239
	CleanupStack::PopAndDestroy(&listDetailsBuf);
hgs
parents:
diff changeset
  2240
hgs
parents:
diff changeset
  2241
	aMessage.Complete(err);
hgs
parents:
diff changeset
  2242
	}
hgs
parents:
diff changeset
  2243
hgs
parents:
diff changeset
  2244
/**
hgs
parents:
diff changeset
  2245
Gets the executables list and returns it in aBuffer if it's big enough
hgs
parents:
diff changeset
  2246
hgs
parents:
diff changeset
  2247
@param aBuffer caller supplied buffer to write data into
hgs
parents:
diff changeset
  2248
@param aSize on return contains the size of the data in the buffer, or the
hgs
parents:
diff changeset
  2249
       size that the buffer would need to be to contain the data
hgs
parents:
diff changeset
  2250
hgs
parents:
diff changeset
  2251
@return KErrNone on success, or KErrTooBig if the requested data will not fit in aBuffer
hgs
parents:
diff changeset
  2252
hgs
parents:
diff changeset
  2253
@leave one of the system wide error codes
hgs
parents:
diff changeset
  2254
*/
hgs
parents:
diff changeset
  2255
TInt CSecuritySvrSession::GetExecutablesListL(TDes8& aBuffer, TUint32& aSize) const
hgs
parents:
diff changeset
  2256
	{
hgs
parents:
diff changeset
  2257
	LOG_MSG("CSecuritySvrSession::GetExecutablesList()");
hgs
parents:
diff changeset
  2258
hgs
parents:
diff changeset
  2259
	//initialise values and connect to file system
hgs
parents:
diff changeset
  2260
	aSize = 0;
hgs
parents:
diff changeset
  2261
	aBuffer.SetLength(0);
hgs
parents:
diff changeset
  2262
	RFs fs;
hgs
parents:
diff changeset
  2263
	User::LeaveIfError(fs.Connect());
hgs
parents:
diff changeset
  2264
	CleanupClosePushL(fs);
hgs
parents:
diff changeset
  2265
hgs
parents:
diff changeset
  2266
	// uids corresponding to executable image
hgs
parents:
diff changeset
  2267
	TUidType uids(KExecutableImageUid, KNullUid, KNullUid);
hgs
parents:
diff changeset
  2268
hgs
parents:
diff changeset
  2269
	//create a string containing the directory name. The drive letter is represented
hgs
parents:
diff changeset
  2270
	//by X but will be replaced by the appropriate drive letter for each drive
hgs
parents:
diff changeset
  2271
	_LIT(KColonSysBin,":\\sys\\bin\\");
hgs
parents:
diff changeset
  2272
hgs
parents:
diff changeset
  2273
	//create a modifiable copy of KColonSysBin, preceeded by an empty space for the drive letter
hgs
parents:
diff changeset
  2274
	RBuf dirName;
hgs
parents:
diff changeset
  2275
	dirName.CreateL(1 + KColonSysBin().Length());
hgs
parents:
diff changeset
  2276
	dirName.CleanupClosePushL();
hgs
parents:
diff changeset
  2277
hgs
parents:
diff changeset
  2278
	//set the length to 1 (to later fill with the drive letter) and then append KColonSysBin
hgs
parents:
diff changeset
  2279
	dirName.SetLength(1);
hgs
parents:
diff changeset
  2280
	dirName.Append(KColonSysBin());
hgs
parents:
diff changeset
  2281
hgs
parents:
diff changeset
  2282
	//get the list of valid drives for the device
hgs
parents:
diff changeset
  2283
	TDriveList driveList;
hgs
parents:
diff changeset
  2284
	User::LeaveIfError(fs.DriveList(driveList));
hgs
parents:
diff changeset
  2285
hgs
parents:
diff changeset
  2286
	//check each valid sys/bin directory for executables
hgs
parents:
diff changeset
  2287
	for(TInt i=0; i<KMaxDrives; i++)
hgs
parents:
diff changeset
  2288
		{
hgs
parents:
diff changeset
  2289
		//if the drive is not valid then skip this drive
hgs
parents:
diff changeset
  2290
		if(!driveList[i])
hgs
parents:
diff changeset
  2291
			{
hgs
parents:
diff changeset
  2292
			//skip processing this drive
hgs
parents:
diff changeset
  2293
			continue;
hgs
parents:
diff changeset
  2294
			}
hgs
parents:
diff changeset
  2295
hgs
parents:
diff changeset
  2296
		//get the drive letter and insert it as the drive letter for dirName
hgs
parents:
diff changeset
  2297
		TChar driveLetter;
hgs
parents:
diff changeset
  2298
		User::LeaveIfError(fs.DriveToChar(i, driveLetter));
hgs
parents:
diff changeset
  2299
		dirName[0] = (TUint)driveLetter;
hgs
parents:
diff changeset
  2300
hgs
parents:
diff changeset
  2301
		//get a list of the exes in this drive's sys/bin directory
hgs
parents:
diff changeset
  2302
		CDir* localDir = NULL;
hgs
parents:
diff changeset
  2303
		TInt err = fs.GetDir(dirName, uids, ESortByName, localDir);
hgs
parents:
diff changeset
  2304
		if(KErrNoMemory == err)
hgs
parents:
diff changeset
  2305
			{
hgs
parents:
diff changeset
  2306
			User::Leave(err);
hgs
parents:
diff changeset
  2307
			}
hgs
parents:
diff changeset
  2308
		if(!localDir)
hgs
parents:
diff changeset
  2309
			{
hgs
parents:
diff changeset
  2310
			//skip processing this drive
hgs
parents:
diff changeset
  2311
			continue;
hgs
parents:
diff changeset
  2312
			}
hgs
parents:
diff changeset
  2313
hgs
parents:
diff changeset
  2314
		//push onto cleanup stack in case we leave
hgs
parents:
diff changeset
  2315
		CleanupStack::PushL(localDir);
hgs
parents:
diff changeset
  2316
hgs
parents:
diff changeset
  2317
		//iterate through the files
hgs
parents:
diff changeset
  2318
		for(TInt j=0; j<localDir->Count(); j++)
hgs
parents:
diff changeset
  2319
			{
hgs
parents:
diff changeset
  2320
			//will store x:\sys\bin\<file-name> type string
hgs
parents:
diff changeset
  2321
			RBuf fullPathName;
hgs
parents:
diff changeset
  2322
hgs
parents:
diff changeset
  2323
			TUint16 nameLength = dirName.Length() + (*localDir)[j].iName.Length();
hgs
parents:
diff changeset
  2324
			fullPathName.CreateL(nameLength);
hgs
parents:
diff changeset
  2325
			fullPathName.CleanupClosePushL();
hgs
parents:
diff changeset
  2326
			fullPathName.Copy(dirName);
hgs
parents:
diff changeset
  2327
			fullPathName.Append((*localDir)[j].iName);
hgs
parents:
diff changeset
  2328
hgs
parents:
diff changeset
  2329
			//add the data to the buffer
hgs
parents:
diff changeset
  2330
			AppendExecutableData(aBuffer, aSize, fullPathName);
hgs
parents:
diff changeset
  2331
hgs
parents:
diff changeset
  2332
			//do cleanup
hgs
parents:
diff changeset
  2333
			CleanupStack::PopAndDestroy(&fullPathName);
hgs
parents:
diff changeset
  2334
			}
hgs
parents:
diff changeset
  2335
hgs
parents:
diff changeset
  2336
		//do cleanup
hgs
parents:
diff changeset
  2337
		CleanupStack::PopAndDestroy(localDir);
hgs
parents:
diff changeset
  2338
		}
hgs
parents:
diff changeset
  2339
hgs
parents:
diff changeset
  2340
	//do cleanup
hgs
parents:
diff changeset
  2341
	CleanupStack::PopAndDestroy(2, &fs);
hgs
parents:
diff changeset
  2342
hgs
parents:
diff changeset
  2343
	//return appropriate value as to whether the kernel's data was too big
hgs
parents:
diff changeset
  2344
	return (aSize <= aBuffer.MaxLength()) ? KErrNone : KErrTooBig;
hgs
parents:
diff changeset
  2345
	}
hgs
parents:
diff changeset
  2346
hgs
parents:
diff changeset
  2347
hgs
parents:
diff changeset
  2348
/**
hgs
parents:
diff changeset
  2349
  Append data to aBuffer and update size of aSize if the data will fit. If it will
hgs
parents:
diff changeset
  2350
  not fit then just puts the nee size in aSize.
hgs
parents:
diff changeset
  2351
hgs
parents:
diff changeset
  2352
  @param aBuffer buffer to append the data to
hgs
parents:
diff changeset
  2353
  @param aSize on return contains the new size of the buffer if the data could be
hgs
parents:
diff changeset
  2354
  appended, otherwise aSize is updated to reflect the size the buffer would have if
hgs
parents:
diff changeset
  2355
  the data had fitted.
hgs
parents:
diff changeset
  2356
  @param aEntryName file name of the entry to add to the buffer
hgs
parents:
diff changeset
  2357
  */
hgs
parents:
diff changeset
  2358
void CSecuritySvrSession::AppendExecutableData(TDes8& aBuffer, TUint32& aSize, const TDesC& aEntryName) const
hgs
parents:
diff changeset
  2359
	{
hgs
parents:
diff changeset
  2360
	//update aSize to include the size of the data for this entry
hgs
parents:
diff changeset
  2361
	aSize = Align4(aSize + sizeof(TExecutablesListEntry) + (2*aEntryName.Length()) - sizeof(TUint16));
hgs
parents:
diff changeset
  2362
hgs
parents:
diff changeset
  2363
	//if the data will fit, and we haven't already stopped putting data in, then append the data,
hgs
parents:
diff changeset
  2364
	//if we've stopped putting data in then aSize will be bigger than aBuffer.MaxLength()
hgs
parents:
diff changeset
  2365
	if(aSize <= aBuffer.MaxLength())
hgs
parents:
diff changeset
  2366
		{
hgs
parents:
diff changeset
  2367
		TExecutablesListEntry& entry = *(TExecutablesListEntry*)(aBuffer.Ptr() + aBuffer.Length());
hgs
parents:
diff changeset
  2368
		//check whether an agent has registered to actively debug fullPathName
hgs
parents:
diff changeset
  2369
		TBool activelyDebugged = IsDebugged(aEntryName, EFalse);
hgs
parents:
diff changeset
  2370
		entry.iIsActivelyDebugged = activelyDebugged ? 1 : 0;
hgs
parents:
diff changeset
  2371
hgs
parents:
diff changeset
  2372
		//check whether any agents have registered to passively debug fullPathName
hgs
parents:
diff changeset
  2373
		TBool passivelyDebugged = IsDebugged(aEntryName, ETrue);
hgs
parents:
diff changeset
  2374
		entry.iIsPassivelyDebugged = passivelyDebugged ? 1 : 0;
hgs
parents:
diff changeset
  2375
hgs
parents:
diff changeset
  2376
		entry.iNameLength = aEntryName.Length();
hgs
parents:
diff changeset
  2377
		TPtr name(&(entry.iName[0]), aEntryName.Length(), aEntryName.Length());
hgs
parents:
diff changeset
  2378
		name = aEntryName;
hgs
parents:
diff changeset
  2379
		//pad the buffer to a four byte boundary
hgs
parents:
diff changeset
  2380
		aBuffer.SetLength(aSize);
hgs
parents:
diff changeset
  2381
		}
hgs
parents:
diff changeset
  2382
	}
hgs
parents:
diff changeset
  2383
/**
hgs
parents:
diff changeset
  2384
Helper function
hgs
parents:
diff changeset
  2385
hgs
parents:
diff changeset
  2386
Write data back to the thread that owns aMessage
hgs
parents:
diff changeset
  2387
hgs
parents:
diff changeset
  2388
@param aMessage the message which is passed between processes
hgs
parents:
diff changeset
  2389
@param aIndex the message slot which the data will be passed back in
hgs
parents:
diff changeset
  2390
@param aPtr pointer to data in this thread to be written into aMessage
hgs
parents:
diff changeset
  2391
@param aPtrSize size in bytes of the data to be written
hgs
parents:
diff changeset
  2392
hgs
parents:
diff changeset
  2393
@leave one of the system wide error codes
hgs
parents:
diff changeset
  2394
*/
hgs
parents:
diff changeset
  2395
void CSecuritySvrSession::WriteDataL(const RMessage2& aMessage, const TInt aIndex, const TAny* aPtr, const TUint32 aPtrSize) const
hgs
parents:
diff changeset
  2396
	{
hgs
parents:
diff changeset
  2397
	TPtr8 dataPtr((TUint8*)aPtr, aPtrSize, aPtrSize);
hgs
parents:
diff changeset
  2398
hgs
parents:
diff changeset
  2399
	aMessage.WriteL(aIndex, dataPtr);
hgs
parents:
diff changeset
  2400
	}
hgs
parents:
diff changeset
  2401
hgs
parents:
diff changeset
  2402
/**
hgs
parents:
diff changeset
  2403
Helper function.
hgs
parents:
diff changeset
  2404
hgs
parents:
diff changeset
  2405
Checks whether the debug agent (the owner of the aMessage) is attached to the
hgs
parents:
diff changeset
  2406
thread with thread id of aThreadId.
hgs
parents:
diff changeset
  2407
hgs
parents:
diff changeset
  2408
@param aThreadId thread ID of target debug thread
hgs
parents:
diff changeset
  2409
@param aMessage message owned by the debug agent
hgs
parents:
diff changeset
  2410
@param aPassive indicates whether to check if attached passively or actively
hgs
parents:
diff changeset
  2411
hgs
parents:
diff changeset
  2412
@leave KErrPermissionDenied if the agent is not attached to the process,
hgs
parents:
diff changeset
  2413
       KErrNoMemory if the security server could not be accessed
hgs
parents:
diff changeset
  2414
*/
hgs
parents:
diff changeset
  2415
void CSecuritySvrSession::CheckAttachedL(const TThreadId aThreadId, const RMessage2& aMessage, const TBool aPassive) const
hgs
parents:
diff changeset
  2416
	{
hgs
parents:
diff changeset
  2417
	//check that the agent has attached to the target process
hgs
parents:
diff changeset
  2418
	if(! Server().CheckAttached(aThreadId, aMessage, aPassive))
hgs
parents:
diff changeset
  2419
		{
hgs
parents:
diff changeset
  2420
		LOG_MSG("CSecuritySvrSession::CheckAttachedL() failed");
hgs
parents:
diff changeset
  2421
		User::Leave(KErrPermissionDenied);
hgs
parents:
diff changeset
  2422
		}
hgs
parents:
diff changeset
  2423
	}
hgs
parents:
diff changeset
  2424
hgs
parents:
diff changeset
  2425
/**
hgs
parents:
diff changeset
  2426
Helper function.
hgs
parents:
diff changeset
  2427
hgs
parents:
diff changeset
  2428
Checks whether the debug agent (the owner of the aMessage) is attached to the
hgs
parents:
diff changeset
  2429
process with process id of aProcessId.
hgs
parents:
diff changeset
  2430
hgs
parents:
diff changeset
  2431
@param aProcessId process ID of target debug thread
hgs
parents:
diff changeset
  2432
@param aMessage message owned by the debug agent
hgs
parents:
diff changeset
  2433
@param aPassive indicates whether to check if attached passively or actively
hgs
parents:
diff changeset
  2434
hgs
parents:
diff changeset
  2435
@leave KErrPermissionDenied if the agent is not attached to the process,
hgs
parents:
diff changeset
  2436
       KErrNoMemory if the security server could not be accessed
hgs
parents:
diff changeset
  2437
*/
hgs
parents:
diff changeset
  2438
void CSecuritySvrSession::CheckAttachedL(const TProcessId aProcessId, const RMessage2& aMessage, const TBool aPassive) const
hgs
parents:
diff changeset
  2439
	{
hgs
parents:
diff changeset
  2440
	
hgs
parents:
diff changeset
  2441
	//check that the agent has attached to the target process
hgs
parents:
diff changeset
  2442
	if(! Server().CheckAttached(aProcessId, aMessage, aPassive))
hgs
parents:
diff changeset
  2443
		{
hgs
parents:
diff changeset
  2444
		LOG_MSG("CSecuritySvrSession::CheckAttachedL() (process) failed");
hgs
parents:
diff changeset
  2445
		User::Leave(KErrPermissionDenied);
hgs
parents:
diff changeset
  2446
		}
hgs
parents:
diff changeset
  2447
	}
hgs
parents:
diff changeset
  2448
hgs
parents:
diff changeset
  2449
/**
hgs
parents:
diff changeset
  2450
Check whether the debug agent is permitted to attach to the target process.
hgs
parents:
diff changeset
  2451
Note that this function does not actually attach the agent to the process, it
hgs
parents:
diff changeset
  2452
simply tests whether an attach call would potentially be successful.
hgs
parents:
diff changeset
  2453
hgs
parents:
diff changeset
  2454
Currently this method returns ETrue in all cases but will be updated once
hgs
parents:
diff changeset
  2455
the security checking framework is in place.
hgs
parents:
diff changeset
  2456
hgs
parents:
diff changeset
  2457
@param aDebugAgentProcessId process id of the debug agent
hgs
parents:
diff changeset
  2458
@param aTargetProcessName original file name of the target process
hgs
parents:
diff changeset
  2459
hgs
parents:
diff changeset
  2460
@return ETrue if the debug agent would be allowed to attch to the target process,
hgs
parents:
diff changeset
  2461
        EFalse otherwise
hgs
parents:
diff changeset
  2462
*/
hgs
parents:
diff changeset
  2463
TBool CSecuritySvrSession::PermitDebugL(const TProcessId aDebugAgentProcessId, const TDesC& aTargetProcessName) const
hgs
parents:
diff changeset
  2464
	{
hgs
parents:
diff changeset
  2465
	return ETrue;
hgs
parents:
diff changeset
  2466
	}
hgs
parents:
diff changeset
  2467
hgs
parents:
diff changeset
  2468
/**
hgs
parents:
diff changeset
  2469
Helper function
hgs
parents:
diff changeset
  2470
hgs
parents:
diff changeset
  2471
Validates that the memory info passed in meets the debug driver's requirements
hgs
parents:
diff changeset
  2472
hgs
parents:
diff changeset
  2473
@param aMemoryInfo memory info passed in from client
hgs
parents:
diff changeset
  2474
hgs
parents:
diff changeset
  2475
@leave KErrArgument if:
hgs
parents:
diff changeset
  2476
	  * size is zero
hgs
parents:
diff changeset
  2477
	  * size is greater than the max block size
hgs
parents:
diff changeset
  2478
	  * size + address > 0xffffffff
hgs
parents:
diff changeset
  2479
	  * address is not access size aligned
hgs
parents:
diff changeset
  2480
	  * size is not a multiple of the access size
hgs
parents:
diff changeset
  2481
	KErrNotSupported if:
hgs
parents:
diff changeset
  2482
	  * iAccess is not TAccess::EAccess32
hgs
parents:
diff changeset
  2483
	  * iEndianess is not TEndianess::EEndLE8
hgs
parents:
diff changeset
  2484
	KErrUnknown if:
hgs
parents:
diff changeset
  2485
	  * the max memory block size cannot be determined
hgs
parents:
diff changeset
  2486
        or one of the other system wide error codes
hgs
parents:
diff changeset
  2487
*/
hgs
parents:
diff changeset
  2488
void CSecuritySvrSession::ValidateMemoryInfoL(const TThreadId aThreadId, const TMemoryInfo &aMemoryInfo, const TBool aReadOperation)
hgs
parents:
diff changeset
  2489
	{
hgs
parents:
diff changeset
  2490
	//check size is not 0
hgs
parents:
diff changeset
  2491
	if(aMemoryInfo.iSize == 0)
hgs
parents:
diff changeset
  2492
		User::Leave(KErrArgument);
hgs
parents:
diff changeset
  2493
hgs
parents:
diff changeset
  2494
	//get the max block size supported
hgs
parents:
diff changeset
  2495
	TUint32 maxSize = 0;
hgs
parents:
diff changeset
  2496
	User::LeaveIfError(Server().iKernelDriver.GetMemoryOperationMaxBlockSize(maxSize));
hgs
parents:
diff changeset
  2497
hgs
parents:
diff changeset
  2498
	//check that the block size given is less than the max block size
hgs
parents:
diff changeset
  2499
	if(aMemoryInfo.iSize > maxSize)
hgs
parents:
diff changeset
  2500
		User::Leave(KErrArgument);
hgs
parents:
diff changeset
  2501
hgs
parents:
diff changeset
  2502
	//must ensure that address + size <= 0xffffffff as will attempt to
hgs
parents:
diff changeset
  2503
	//read past 0xffffffff, which wouldn't be good
hgs
parents:
diff changeset
  2504
	TUint32 maxAddress = (~aMemoryInfo.iSize) + 1;
hgs
parents:
diff changeset
  2505
	if(aMemoryInfo.iAddress > maxAddress)
hgs
parents:
diff changeset
  2506
		User::Leave(KErrArgument);
hgs
parents:
diff changeset
  2507
hgs
parents:
diff changeset
  2508
	//check that arguments are supported
hgs
parents:
diff changeset
  2509
	if(aMemoryInfo.iAccess != EAccess32)
hgs
parents:
diff changeset
  2510
		User::Leave(KErrNotSupported);
hgs
parents:
diff changeset
  2511
hgs
parents:
diff changeset
  2512
	if(aMemoryInfo.iEndianess != EEndLE8)
hgs
parents:
diff changeset
  2513
		User::Leave(KErrNotSupported);
hgs
parents:
diff changeset
  2514
hgs
parents:
diff changeset
  2515
	//check that address is multiple of access size
hgs
parents:
diff changeset
  2516
	TInt addressIndicator = aMemoryInfo.iAddress % aMemoryInfo.iAccess;
hgs
parents:
diff changeset
  2517
	if(addressIndicator != 0)
hgs
parents:
diff changeset
  2518
		{
hgs
parents:
diff changeset
  2519
		User::Leave(KErrArgument);
hgs
parents:
diff changeset
  2520
		}
hgs
parents:
diff changeset
  2521
hgs
parents:
diff changeset
  2522
	//check that size is multiple of access size
hgs
parents:
diff changeset
  2523
	TInt sizeIndicator = aMemoryInfo.iSize % aMemoryInfo.iAccess;
hgs
parents:
diff changeset
  2524
	if(sizeIndicator != 0)
hgs
parents:
diff changeset
  2525
		User::Leave(KErrArgument);
hgs
parents:
diff changeset
  2526
	}
hgs
parents:
diff changeset
  2527
hgs
parents:
diff changeset
  2528
/**
hgs
parents:
diff changeset
  2529
Helper function
hgs
parents:
diff changeset
  2530
hgs
parents:
diff changeset
  2531
Validates that the three buffers relating to reading register data are of
hgs
parents:
diff changeset
  2532
appropriate sizes, and calculates the number of registers being requested.
hgs
parents:
diff changeset
  2533
hgs
parents:
diff changeset
  2534
@param aMessage message which in offsets 1, 2 and 3 contains descriptors
hgs
parents:
diff changeset
  2535
@param aNumberOfRegisters if the function returns with KErrNone this will
hgs
parents:
diff changeset
  2536
       contain the number of registers being requested, guaranteed to be non-zero
hgs
parents:
diff changeset
  2537
hgs
parents:
diff changeset
  2538
@leave KErrArgument if descriptors do not represent the same number of
hgs
parents:
diff changeset
  2539
       registers, if any of the descriptors have max length of 0, if any of
hgs
parents:
diff changeset
  2540
       the descriptors have max lengths which are not multiples of their data
hgs
parents:
diff changeset
  2541
       type's size or if any of the descriptors have max lengths greater than
hgs
parents:
diff changeset
  2542
       the max block size for memory operations
hgs
parents:
diff changeset
  2543
       or one of the other system wide error codes if there were problems 
hgs
parents:
diff changeset
  2544
       in getting the descriptors' lengths.
hgs
parents:
diff changeset
  2545
*/
hgs
parents:
diff changeset
  2546
void CSecuritySvrSession::ValidateRegisterBuffersL(const RMessage2& aMessage, TUint32& aNumberOfRegisters)
hgs
parents:
diff changeset
  2547
	{
hgs
parents:
diff changeset
  2548
	//get lengths of buffers, if error occurs returned value will be less then zero
hgs
parents:
diff changeset
  2549
	TInt idsBufferLength = aMessage.GetDesMaxLength(1);
hgs
parents:
diff changeset
  2550
	if(idsBufferLength < 0)
hgs
parents:
diff changeset
  2551
		{
hgs
parents:
diff changeset
  2552
		User::Leave(idsBufferLength);
hgs
parents:
diff changeset
  2553
		}
hgs
parents:
diff changeset
  2554
	TInt valuesBufferLength = aMessage.GetDesMaxLength(2);
hgs
parents:
diff changeset
  2555
	if(valuesBufferLength < 0)
hgs
parents:
diff changeset
  2556
		{
hgs
parents:
diff changeset
  2557
		User::Leave(valuesBufferLength);
hgs
parents:
diff changeset
  2558
		}
hgs
parents:
diff changeset
  2559
	TInt flagsBufferLength = aMessage.GetDesMaxLength(3);
hgs
parents:
diff changeset
  2560
	if(flagsBufferLength < 0)
hgs
parents:
diff changeset
  2561
		{
hgs
parents:
diff changeset
  2562
		User::Leave(flagsBufferLength);
hgs
parents:
diff changeset
  2563
		}
hgs
parents:
diff changeset
  2564
hgs
parents:
diff changeset
  2565
	//get the max block size supported
hgs
parents:
diff changeset
  2566
	TUint32 maxSize = 0;
hgs
parents:
diff changeset
  2567
	User::LeaveIfError(Server().iKernelDriver.GetMemoryOperationMaxBlockSize(maxSize));
hgs
parents:
diff changeset
  2568
hgs
parents:
diff changeset
  2569
	//check none of the descriptors have size greater than the max block size
hgs
parents:
diff changeset
  2570
	if((idsBufferLength > maxSize) || (valuesBufferLength > maxSize) || (flagsBufferLength > maxSize))
hgs
parents:
diff changeset
  2571
		User::Leave(KErrArgument);
hgs
parents:
diff changeset
  2572
hgs
parents:
diff changeset
  2573
	//get sizes of the three types of data the buffers represent arrays of
hgs
parents:
diff changeset
  2574
	//and validate that the buffer lengths are multiples of the data sizes
hgs
parents:
diff changeset
  2575
	TUint idSize = sizeof(TRegisterInfo);
hgs
parents:
diff changeset
  2576
	if(idsBufferLength % idSize != 0)
hgs
parents:
diff changeset
  2577
		User::Leave(KErrArgument);
hgs
parents:
diff changeset
  2578
hgs
parents:
diff changeset
  2579
	TUint flagSize = sizeof(TUint8);
hgs
parents:
diff changeset
  2580
	if(flagsBufferLength % flagSize != 0)
hgs
parents:
diff changeset
  2581
		User::Leave(KErrArgument);
hgs
parents:
diff changeset
  2582
hgs
parents:
diff changeset
  2583
	//perform check on id buffer length
hgs
parents:
diff changeset
  2584
	if(idsBufferLength == 0)
hgs
parents:
diff changeset
  2585
		User::Leave(KErrArgument);
hgs
parents:
diff changeset
  2586
hgs
parents:
diff changeset
  2587
	//calculate number of registers being requested
hgs
parents:
diff changeset
  2588
	aNumberOfRegisters = idsBufferLength / idSize;
hgs
parents:
diff changeset
  2589
hgs
parents:
diff changeset
  2590
	//check flags buffer is of appropriate size
hgs
parents:
diff changeset
  2591
	if(flagsBufferLength != (aNumberOfRegisters * flagSize))
hgs
parents:
diff changeset
  2592
		User::Leave(KErrArgument);
hgs
parents:
diff changeset
  2593
	}
hgs
parents:
diff changeset
  2594
hgs
parents:
diff changeset
  2595
/**
hgs
parents:
diff changeset
  2596
Establish whether any agents have registered to debug the specified aFileName
hgs
parents:
diff changeset
  2597
hgs
parents:
diff changeset
  2598
@param aFileName originating file name of the target process
hgs
parents:
diff changeset
  2599
@param aPassive indicates whether to check if there has been active attachment,
hgs
parents:
diff changeset
  2600
or passive attachment.
hgs
parents:
diff changeset
  2601
hgs
parents:
diff changeset
  2602
@return ETrue if aFileName is being debugged, EFalse otherwise
hgs
parents:
diff changeset
  2603
hgs
parents:
diff changeset
  2604
*/
hgs
parents:
diff changeset
  2605
TBool CSecuritySvrSession::IsDebugged(const TDesC& aFileName, const TBool aPassive) const
hgs
parents:
diff changeset
  2606
	{
hgs
parents:
diff changeset
  2607
	//check whether the target process is being debugged
hgs
parents:
diff changeset
  2608
	return Server().IsDebugged(aFileName, aPassive);
hgs
parents:
diff changeset
  2609
	}
hgs
parents:
diff changeset
  2610
hgs
parents:
diff changeset
  2611
/**
hgs
parents:
diff changeset
  2612
  Helper function which reads a TThreadId object from a client
hgs
parents:
diff changeset
  2613
hgs
parents:
diff changeset
  2614
  @param aMessage the message object containing the reference to the TThreadId
hgs
parents:
diff changeset
  2615
  @param aIndex the message argument containing the reference
hgs
parents:
diff changeset
  2616
hgs
parents:
diff changeset
  2617
  @return the TThreadId passed in by the client
hgs
parents:
diff changeset
  2618
  @leave KErrArgument if aIndex is outside of the valid range
hgs
parents:
diff changeset
  2619
  */
hgs
parents:
diff changeset
  2620
TThreadId CSecuritySvrSession::ReadTThreadIdL(const RMessagePtr2& aMessage, const TInt aIndex) const
hgs
parents:
diff changeset
  2621
	{
hgs
parents:
diff changeset
  2622
	//create a temporary TThreadId to read the data into
hgs
parents:
diff changeset
  2623
	TThreadId tempThreadId;
hgs
parents:
diff changeset
  2624
	TPtr8 threadIdPtr((TUint8*)&tempThreadId, sizeof(TThreadId));
hgs
parents:
diff changeset
  2625
hgs
parents:
diff changeset
  2626
	// read the data in from the client
hgs
parents:
diff changeset
  2627
	aMessage.ReadL(aIndex, threadIdPtr);
hgs
parents:
diff changeset
  2628
hgs
parents:
diff changeset
  2629
	return tempThreadId;
hgs
parents:
diff changeset
  2630
	}
hgs
parents:
diff changeset
  2631
hgs
parents:
diff changeset
  2632
/**
hgs
parents:
diff changeset
  2633
  Helper function which reads a TProcessId object from a client
hgs
parents:
diff changeset
  2634
hgs
parents:
diff changeset
  2635
  @param aMessage the message object containing the reference to the TProcessId
hgs
parents:
diff changeset
  2636
  @param aIndex the message argument containing the reference
hgs
parents:
diff changeset
  2637
hgs
parents:
diff changeset
  2638
  @return the TProcessId passed in by the client
hgs
parents:
diff changeset
  2639
  @leave KErrArgument if aIndex is outside of the valid range
hgs
parents:
diff changeset
  2640
  */
hgs
parents:
diff changeset
  2641
TProcessId CSecuritySvrSession::ReadTProcessIdL(const RMessagePtr2& aMessage, const TInt aIndex) const
hgs
parents:
diff changeset
  2642
	{
hgs
parents:
diff changeset
  2643
	//create a temporary TProcessId to read the data into
hgs
parents:
diff changeset
  2644
	TProcessId tempProcessId;
hgs
parents:
diff changeset
  2645
	TPtr8 processIdPtr((TUint8*)&tempProcessId, sizeof(TProcessId));
hgs
parents:
diff changeset
  2646
hgs
parents:
diff changeset
  2647
	// read the data in from the client
hgs
parents:
diff changeset
  2648
	aMessage.ReadL(aIndex, processIdPtr);
hgs
parents:
diff changeset
  2649
hgs
parents:
diff changeset
  2650
	return tempProcessId;
hgs
parents:
diff changeset
  2651
	}
hgs
parents:
diff changeset
  2652
hgs
parents:
diff changeset
  2653
// End of file - c_security_svr_session.cpp