debugsrv/runmodedebug/securityserver/inc/c_security_svr_session.h
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
// Definitions for the security server server side session.
hgs
parents:
diff changeset
    15
// 
hgs
parents:
diff changeset
    16
//
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#ifndef C_SECURITY_SVR_SESSION_H
hgs
parents:
diff changeset
    19
#define C_SECURITY_SVR_SESSION_H
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
// forward declaration
hgs
parents:
diff changeset
    22
class CSecuritySvrAsync;
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
#include "c_security_svr_async.h"
hgs
parents:
diff changeset
    25
#include <f32file.h>
hgs
parents:
diff changeset
    26
#include <d32locd.h>
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
#include <rm_debug_api.h>
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
#include "rm_debug_kerneldriver.h"
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
// Server name
hgs
parents:
diff changeset
    33
_LIT(KDebugDriverName,"RunMode Debug Driver");
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
class CSecuritySvrServer;
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
/**
hgs
parents:
diff changeset
    38
Debug Security Server session. Manages the session with one debug agent and
hgs
parents:
diff changeset
    39
as many target executables as it has attached to.
hgs
parents:
diff changeset
    40
*/
hgs
parents:
diff changeset
    41
class CSecuritySvrSession : public CSession2
hgs
parents:
diff changeset
    42
	{
hgs
parents:
diff changeset
    43
public:
hgs
parents:
diff changeset
    44
	CSecuritySvrSession(const TProcessId& aDebugAgentProcessId);
hgs
parents:
diff changeset
    45
	~CSecuritySvrSession();
hgs
parents:
diff changeset
    46
	void ConstructL ();
hgs
parents:
diff changeset
    47
	void CreateL();
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
	TInt OpenHandle(const TRM_DebugDriverInfo& aDriverInfo);
hgs
parents:
diff changeset
    50
	void ServiceL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    51
	void ServiceError(const RMessage2 &aMessage, TInt aError);
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
	void ResumeThreadL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    54
	void SuspendThreadL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    55
	//break
hgs
parents:
diff changeset
    56
	void SetBreakL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    57
	void ClearBreakL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    58
	void ModifyBreakL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    59
	void BreakInfoL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    60
hgs
parents:
diff changeset
    61
	void StepRangeL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    62
hgs
parents:
diff changeset
    63
	void GetEventL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    64
	void CancelGetEventL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
	void AttachProcessL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    67
	void DetachProcessL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    68
	
hgs
parents:
diff changeset
    69
    void AttachAllL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    70
    void DetachAllL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    71
    
hgs
parents:
diff changeset
    72
	//debug functionality
hgs
parents:
diff changeset
    73
	void GetDebugFunctionalityBufSizeL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    74
	void GetDebugFunctionalityL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    75
	//memory
hgs
parents:
diff changeset
    76
	void ReadMemoryL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    77
	void WriteMemoryL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    78
	//registers
hgs
parents:
diff changeset
    79
	void ReadRegistersL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    80
	void WriteRegistersL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    81
	//event
hgs
parents:
diff changeset
    82
	void SetEventActionL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    83
hgs
parents:
diff changeset
    84
	void GetListL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    85
	void StepL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    86
	void TraceExecutableL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    87
	
hgs
parents:
diff changeset
    88
	//crash log
hgs
parents:
diff changeset
    89
	void ReadCrashLogL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    90
	void WriteCrashConfigL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    91
	void EraseCrashLogL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    92
	void EraseEntireCrashLogL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    93
hgs
parents:
diff changeset
    94
	void SetProcessBreakL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    95
	void ModifyProcessBreakL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    96
	void ProcessBreakInfoL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    97
hgs
parents:
diff changeset
    98
	void KillProcessL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
	TCapabilitySet GetOEMDebugCapabilities(void) const { return iOEMDebugCapabilities; };
hgs
parents:
diff changeset
   101
hgs
parents:
diff changeset
   102
#ifdef _DEBUG
hgs
parents:
diff changeset
   103
	void DoFailAlloc(const RMessage2& aMessage);
hgs
parents:
diff changeset
   104
#endif
hgs
parents:
diff changeset
   105
hgs
parents:
diff changeset
   106
private:
hgs
parents:
diff changeset
   107
	CSecuritySvrServer& Server() const;
hgs
parents:
diff changeset
   108
	void HeapWatcher(const TUint32 aFunction, const TBool aEntry) const;
hgs
parents:
diff changeset
   109
	void WriteDataL(const RMessage2& aMessage, const TInt aIndex, const TAny* aPtr, const TUint32 aPtrSize) const;
hgs
parents:
diff changeset
   110
	void CheckAttachedL(const TThreadId aThreadId, const RMessage2& aMessage, const TBool aPassive) const;
hgs
parents:
diff changeset
   111
	void CheckAttachedL(const TProcessId aProcessId, const RMessage2& aMessage, const TBool aPassive) const;
hgs
parents:
diff changeset
   112
	TBool PermitDebugL(const TProcessId aDebugAgentProcessId, const TDesC& aTargetProcessName) const;
hgs
parents:
diff changeset
   113
	TBool IsDebugged(const TDesC& aFileName, const TBool aPassive) const;
hgs
parents:
diff changeset
   114
	void OpenFileHandleL(const TDesC& aFileName, RFs& aFs, RFile& aFileHandle);
hgs
parents:
diff changeset
   115
	TBool IsTraceBitSet(const TDesC8& aHeaderData, const TBool aXip);
hgs
parents:
diff changeset
   116
	TBool IsDebugBitSet(const TDesC8& aHeaderData, const TBool aXip);
hgs
parents:
diff changeset
   117
	TBool CheckSufficientData(const TDesC8& aHeaderData, const TBool aXip) const;
hgs
parents:
diff changeset
   118
hgs
parents:
diff changeset
   119
	void ValidateMemoryInfoL(const TThreadId aThreadId, const Debug::TMemoryInfo &aMemoryInfo, const TBool aReadOperation);
hgs
parents:
diff changeset
   120
	void ValidateRegisterBuffersL(const RMessage2& aMessage, TUint32& aNumberOfRegisters);
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
	TInt GetExecutablesListL(TDes8& aBuffer, TUint32& aSize) const;
hgs
parents:
diff changeset
   123
	void AppendExecutableData(TDes8& aBuffer, TUint32& aSize, const TDesC& aEntryName) const;
hgs
parents:
diff changeset
   124
	void GetSecureIdL(const TDesC& aFileName, TUid& aSecureId);
hgs
parents:
diff changeset
   125
	TUid GetSecureIdL(const TDesC8& aHeaderData, TBool aXip);
hgs
parents:
diff changeset
   126
hgs
parents:
diff changeset
   127
	void IsDebuggableL(const TDesC& aFileName);
hgs
parents:
diff changeset
   128
	TThreadId ReadTThreadIdL(const RMessagePtr2& aMessage, const TInt aIndex) const;
hgs
parents:
diff changeset
   129
	TProcessId ReadTProcessIdL(const RMessagePtr2& aMessage, const TInt aIndex) const;
hgs
parents:
diff changeset
   130
	TBool IsExecutableXipL(RFile& aExecutable);
hgs
parents:
diff changeset
   131
	
hgs
parents:
diff changeset
   132
	void ConnectCrashPartitionL(void);
hgs
parents:
diff changeset
   133
hgs
parents:
diff changeset
   134
	void GetDebugAgentOEMTokenCapsL();
hgs
parents:
diff changeset
   135
	TInt CheckFlashAccessPermissionL(const RThread& aClientThread);
hgs
parents:
diff changeset
   136
hgs
parents:
diff changeset
   137
	// Declare the CSecuritySvrAsync as a friend so it can use the iKernelDriver too
hgs
parents:
diff changeset
   138
	friend class CSecuritySvrAsync;
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
private:
hgs
parents:
diff changeset
   141
	/**
hgs
parents:
diff changeset
   142
	The TProcessId of the Debug Agent associated with this session. A convenience to
hgs
parents:
diff changeset
   143
	save looking it up repeatedly.
hgs
parents:
diff changeset
   144
	*/
hgs
parents:
diff changeset
   145
	TProcessId iDebugAgentProcessId;
hgs
parents:
diff changeset
   146
	/**
hgs
parents:
diff changeset
   147
	Need an array of async completion objects, one for each target executable.
hgs
parents:
diff changeset
   148
	*/
hgs
parents:
diff changeset
   149
	RPointerArray<CSecuritySvrAsync> iAsyncHandlers;
hgs
parents:
diff changeset
   150
hgs
parents:
diff changeset
   151
	/**
hgs
parents:
diff changeset
   152
	Used to track whether the Debug Agent has been notified when closing the session.
hgs
parents:
diff changeset
   153
	*/
hgs
parents:
diff changeset
   154
	TBool iServerNotified;
hgs
parents:
diff changeset
   155
hgs
parents:
diff changeset
   156
	/**
hgs
parents:
diff changeset
   157
	OEM Debug token support. This is only used when the Debug Agent has OEM debug 
hgs
parents:
diff changeset
   158
	authority provided by a specific authorisation token file. This token confers
hgs
parents:
diff changeset
   159
	the ability to debug certain executables which have not been built as 'Debuggable'.
hgs
parents:
diff changeset
   160
	
hgs
parents:
diff changeset
   161
	The OEM Debug token executable must be marked with 'AllFiles', as this is analogous
hgs
parents:
diff changeset
   162
	to looking 'inside' executables - with AllFiles, it could read all the data out of an
hgs
parents:
diff changeset
   163
	executable in \sys\bin\. In addition, since debug control of an executable implies the
hgs
parents:
diff changeset
   164
	ability to execute arbitrary code within the target process space, this would imply that
hgs
parents:
diff changeset
   165
	a Debug Agent could use any PlatSec capability which that target process possessed.
hgs
parents:
diff changeset
   166
	
hgs
parents:
diff changeset
   167
	Therefore, we require that the OEM Debug Token must also be marked with a superset of
hgs
parents:
diff changeset
   168
	the PlatSec capabilities of the executable which is to be debugged. This means the
hgs
parents:
diff changeset
   169
	Debug Agent is not granted more access/PlatSec capabilities than its authorisation
hgs
parents:
diff changeset
   170
	token allows, and cannot exploit a target executable to leverage greater access than
hgs
parents:
diff changeset
   171
	should be permitted.
hgs
parents:
diff changeset
   172
hgs
parents:
diff changeset
   173
	iTargetCapabilities tracks which PlatSec capabilities the target executables may
hgs
parents:
diff changeset
   174
	possess and still be debugged by this debug agent. The capabilities are NOT those
hgs
parents:
diff changeset
   175
	of the debug agent process, they are the capabilites indicated in the OEM Debug Token
hgs
parents:
diff changeset
   176
	which describe the capabilities the debug agent is authorised to debug. E.g. a Debug
hgs
parents:
diff changeset
   177
	Agent might use CommsDD, but wish to debug a DRM capable executable. In that case, the
hgs
parents:
diff changeset
   178
	Debug Agent exe must be signed with CommsDD, but the OEM Debug Token need only possess
hgs
parents:
diff changeset
   179
	DRM and AllFiles (permission to look inside another executable).
hgs
parents:
diff changeset
   180
	*/
hgs
parents:
diff changeset
   181
	TCapabilitySet iOEMDebugCapabilities;
hgs
parents:
diff changeset
   182
	
hgs
parents:
diff changeset
   183
	//RLocalDrive to access the crash Flash
hgs
parents:
diff changeset
   184
	RLocalDrive iLocalDrive;
hgs
parents:
diff changeset
   185
	
hgs
parents:
diff changeset
   186
	//For NOR flash 
hgs
parents:
diff changeset
   187
	TLocalDriveCapsV2 iCaps;
hgs
parents:
diff changeset
   188
	
hgs
parents:
diff changeset
   189
	/**
hgs
parents:
diff changeset
   190
	 * If true means the local drive connected to the crash partition else connect 
hgs
parents:
diff changeset
   191
	 * when access required to crash flash partition for read operation
hgs
parents:
diff changeset
   192
	*/	
hgs
parents:
diff changeset
   193
	TBool iCrashConnected;
hgs
parents:
diff changeset
   194
	};
hgs
parents:
diff changeset
   195
hgs
parents:
diff changeset
   196
hgs
parents:
diff changeset
   197
#endif // C_SECURITY_SVR_SESSION_H
hgs
parents:
diff changeset
   198