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