perfsrv/memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanThreadAndProcess.cpp
author hgs
Wed, 29 Sep 2010 17:45:35 +0300
changeset 54 a151135b0cf9
parent 51 98307c651589
permissions -rw-r--r--
201039
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
51
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include "MemSpyDriverLogChanThreadAndProcess.h"
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
// System includes
hgs
parents:
diff changeset
    21
#include <platform.h>
hgs
parents:
diff changeset
    22
#include <memspy/driver/memspydriverobjectsshared.h>
hgs
parents:
diff changeset
    23
#include <memspy/driver/memspydriverpanics.h>
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
// Shared includes
hgs
parents:
diff changeset
    26
#include "MemSpyDriverOpCodes.h"
hgs
parents:
diff changeset
    27
#include "MemSpyDriverObjectsInternal.h"
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
// User includes
hgs
parents:
diff changeset
    30
#include "MemSpyDriverUtils.h"
hgs
parents:
diff changeset
    31
#include "MemSpyDriverOSAdaption.h"
hgs
parents:
diff changeset
    32
#include "MemSpyDriverSuspensionManager.h"
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
// Constants
hgs
parents:
diff changeset
    35
const TBool KMemSpyDriverAllowDeadOpenRequests = ETrue;
hgs
parents:
diff changeset
    36
const TInt KMemSpyDriverLogChanThreadAndProcessXferBufferSize = 512;
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
DMemSpyDriverLogChanThreadAndProcess::DMemSpyDriverLogChanThreadAndProcess( DMemSpyDriverDevice& aDevice, DThread& aThread )
hgs
parents:
diff changeset
    40
:   DMemSpyDriverLogChanBase( aDevice, aThread )
hgs
parents:
diff changeset
    41
    {
hgs
parents:
diff changeset
    42
    TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::DMemSpyDriverLogChanThreadAndProcess() - this: 0x%08x", this ));
hgs
parents:
diff changeset
    43
    }
hgs
parents:
diff changeset
    44
hgs
parents:
diff changeset
    45
hgs
parents:
diff changeset
    46
DMemSpyDriverLogChanThreadAndProcess::~DMemSpyDriverLogChanThreadAndProcess()
hgs
parents:
diff changeset
    47
	{
hgs
parents:
diff changeset
    48
	TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::~DMemSpyDriverLogChanThreadAndProcess() - START - this: 0x%08x", this ));
hgs
parents:
diff changeset
    49
hgs
parents:
diff changeset
    50
	TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::~DMemSpyDriverLogChanThreadAndProcess() - END - this: 0x%08x", this ));
hgs
parents:
diff changeset
    51
	}
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
hgs
parents:
diff changeset
    54
TInt DMemSpyDriverLogChanThreadAndProcess::Construct()
hgs
parents:
diff changeset
    55
	{
hgs
parents:
diff changeset
    56
	TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::Construct() - START - this: 0x%08x", this ));
hgs
parents:
diff changeset
    57
    
hgs
parents:
diff changeset
    58
    const TInt ret = BaseConstruct( KMemSpyDriverLogChanThreadAndProcessXferBufferSize );
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
	TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::Construct() - END - this: 0x%08x, err: %d", this, ret ));
hgs
parents:
diff changeset
    61
    return ret;
hgs
parents:
diff changeset
    62
	}
hgs
parents:
diff changeset
    63
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
TInt DMemSpyDriverLogChanThreadAndProcess::Request( TInt aFunction, TAny* a1, TAny* a2 )
hgs
parents:
diff changeset
    66
	{
hgs
parents:
diff changeset
    67
	TInt r = DMemSpyDriverLogChanBase::Request( aFunction, a1, a2 );
hgs
parents:
diff changeset
    68
    if  ( r == KErrNone )
hgs
parents:
diff changeset
    69
        {
hgs
parents:
diff changeset
    70
	    switch( aFunction )
hgs
parents:
diff changeset
    71
		    {
hgs
parents:
diff changeset
    72
	    case EMemSpyDriverOpCodeThreadAndProcessGetInfoThread:
hgs
parents:
diff changeset
    73
		    r = GetInfoThread( (TUint)a1, (TMemSpyDriverInternalThreadInfoParams*) a2);
hgs
parents:
diff changeset
    74
		    break;
hgs
parents:
diff changeset
    75
	    case EMemSpyDriverOpCodeThreadAndProcessGetInfoProcess:
hgs
parents:
diff changeset
    76
		    r = GetInfoProcess( (TUint)a1, (TMemSpyDriverProcessInfo*) a2);
hgs
parents:
diff changeset
    77
		    break;
hgs
parents:
diff changeset
    78
        case EMemSpyDriverOpCodeThreadAndProcessEndThread:
hgs
parents:
diff changeset
    79
            r = EndThread( (TUint) a1, (TExitType) ((TUint) a2) );
hgs
parents:
diff changeset
    80
            break;
hgs
parents:
diff changeset
    81
        case EMemSpyDriverOpCodeThreadAndProcessOpenThread:
hgs
parents:
diff changeset
    82
            r = OpenThread( (TUint) a1 );
hgs
parents:
diff changeset
    83
            break;
hgs
parents:
diff changeset
    84
        case EMemSpyDriverOpCodeThreadAndProcessOpenProcess:
hgs
parents:
diff changeset
    85
            r = OpenProcess( (TUint) a1 );
hgs
parents:
diff changeset
    86
            break;
hgs
parents:
diff changeset
    87
        case EMemSpyDriverOpCodeThreadAndProcessSuspendAllThreads:
hgs
parents:
diff changeset
    88
            r = SuspendAllThreadsInProcess( (TUint) a1 );
hgs
parents:
diff changeset
    89
            break;
hgs
parents:
diff changeset
    90
        case EMemSpyDriverOpCodeThreadAndProcessResumeAllThreads:
hgs
parents:
diff changeset
    91
            r = ResumeAllThreadsInProcess( (TUint) a1 );
hgs
parents:
diff changeset
    92
            break;
hgs
parents:
diff changeset
    93
        case EMemSpyDriverOpCodeThreadAndProcessGetThreads:
hgs
parents:
diff changeset
    94
            r = GetThreadsForProcess( (TUint) a1, (TDes8*) a2 );
hgs
parents:
diff changeset
    95
            break;
hgs
parents:
diff changeset
    96
        case EMemSpyDriverOpCodeThreadAndProcessSetPriorityThread:
hgs
parents:
diff changeset
    97
            r = SetPriority( (TUint) a1, (TThreadPriority) ((TUint) a2) );
hgs
parents:
diff changeset
    98
            break;
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
        default:
hgs
parents:
diff changeset
   101
            r = KErrNotSupported;
hgs
parents:
diff changeset
   102
		    break;
hgs
parents:
diff changeset
   103
		    }
hgs
parents:
diff changeset
   104
        }
hgs
parents:
diff changeset
   105
    //
hgs
parents:
diff changeset
   106
    return r;
hgs
parents:
diff changeset
   107
	}
hgs
parents:
diff changeset
   108
hgs
parents:
diff changeset
   109
hgs
parents:
diff changeset
   110
TBool DMemSpyDriverLogChanThreadAndProcess::IsHandler( TInt aFunction ) const
hgs
parents:
diff changeset
   111
    {
hgs
parents:
diff changeset
   112
    return ( aFunction > EMemSpyDriverOpCodeThreadAndProcessBase && aFunction < EMemSpyDriverOpCodeThreadAndProcessEnd );
hgs
parents:
diff changeset
   113
    }
hgs
parents:
diff changeset
   114
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
hgs
parents:
diff changeset
   119
hgs
parents:
diff changeset
   120
TInt DMemSpyDriverLogChanThreadAndProcess::GetInfoThread( TUint aTid, TMemSpyDriverInternalThreadInfoParams* aParams )
hgs
parents:
diff changeset
   121
	{
hgs
parents:
diff changeset
   122
    TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::GetInfoThread() - START"));
hgs
parents:
diff changeset
   123
hgs
parents:
diff changeset
   124
    TMemSpyDriverInternalThreadInfoParams params;
hgs
parents:
diff changeset
   125
    TInt r = Kern::ThreadRawRead( &ClientThread(), aParams, &params, sizeof(TMemSpyDriverInternalThreadInfoParams) );
hgs
parents:
diff changeset
   126
    if  ( r != KErrNone )
hgs
parents:
diff changeset
   127
        {
hgs
parents:
diff changeset
   128
    	TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::GetInfoThread() - END - params read error: %d", r));
hgs
parents:
diff changeset
   129
        return r;
hgs
parents:
diff changeset
   130
        }
hgs
parents:
diff changeset
   131
hgs
parents:
diff changeset
   132
	r = OpenTempObject( aTid, EThread );
hgs
parents:
diff changeset
   133
	if  ( r == KErrNone )
hgs
parents:
diff changeset
   134
		{
hgs
parents:
diff changeset
   135
		DThread* dThread = (DThread*) TempObject();
hgs
parents:
diff changeset
   136
  	    NKern::ThreadEnterCS();
hgs
parents:
diff changeset
   137
hgs
parents:
diff changeset
   138
        // Get DThread adaptor. This is a means of querying DThread internals
hgs
parents:
diff changeset
   139
        // without accessing them directly. Takes into account possible differences
hgs
parents:
diff changeset
   140
        // between compile time and run time
hgs
parents:
diff changeset
   141
        DMemSpyDriverOSAdaptionDThread& dThreadAdaptor = OSAdaption().DThread();
hgs
parents:
diff changeset
   142
hgs
parents:
diff changeset
   143
        // Saved CPU registers for thread. Need to get NThread to do this.
hgs
parents:
diff changeset
   144
        NThread* nThread = dThreadAdaptor.GetNThread( *dThread );
hgs
parents:
diff changeset
   145
    	TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::GetInfoThread() - getting regs..." ));
hgs
parents:
diff changeset
   146
        MemSpyDriverUtils::GetThreadRegisters( nThread, params.iCpu );
hgs
parents:
diff changeset
   147
		
hgs
parents:
diff changeset
   148
        // Name
hgs
parents:
diff changeset
   149
    	TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::GetInfoThread() - getting full name..." ));
hgs
parents:
diff changeset
   150
		dThread->FullName( params.iFullName );
hgs
parents:
diff changeset
   151
hgs
parents:
diff changeset
   152
        // User framework
hgs
parents:
diff changeset
   153
    	TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::GetInfoThread() - getting allocator..." ));
hgs
parents:
diff changeset
   154
        params.iAllocator = dThreadAdaptor.GetAllocator( *dThread );
hgs
parents:
diff changeset
   155
hgs
parents:
diff changeset
   156
        TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::GetInfoThread() - getting scheduler..." ));
hgs
parents:
diff changeset
   157
        params.iScheduler = dThreadAdaptor.GetActiveScheduler( *dThread );
hgs
parents:
diff changeset
   158
hgs
parents:
diff changeset
   159
        // User stack information - rest comes from user side API calls
hgs
parents:
diff changeset
   160
        TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::GetInfoThread() - getting user stack pointer..." ));
hgs
parents:
diff changeset
   161
        params.iStackInfo.iUserStackPointer = params.iCpu.iRn[ 12 ];
hgs
parents:
diff changeset
   162
hgs
parents:
diff changeset
   163
        // Supervisor stack information
hgs
parents:
diff changeset
   164
        TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::GetInfoThread() - getting supervisor stack..." ));
hgs
parents:
diff changeset
   165
        params.iStackInfo.iSupervisorStackPointer = 0;
hgs
parents:
diff changeset
   166
        params.iStackInfo.iSupervisorStackHighWatermark = 0;
hgs
parents:
diff changeset
   167
        params.iStackInfo.iSupervisorStackBase = dThreadAdaptor.GetSupervisorStackBase( *dThread );
hgs
parents:
diff changeset
   168
        params.iStackInfo.iSupervisorStackSize = dThreadAdaptor.GetSupervisorStackSize( *dThread );
hgs
parents:
diff changeset
   169
 
hgs
parents:
diff changeset
   170
        // Write back to user-side
hgs
parents:
diff changeset
   171
        TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::GetInfoThread() - writing to user side..." ));
hgs
parents:
diff changeset
   172
        r = Kern::ThreadRawWrite( &ClientThread(), aParams, &params, sizeof(TMemSpyDriverInternalThreadInfoParams) );
hgs
parents:
diff changeset
   173
	    NKern::ThreadLeaveCS();
hgs
parents:
diff changeset
   174
		CloseTempObject();
hgs
parents:
diff changeset
   175
		}
hgs
parents:
diff changeset
   176
hgs
parents:
diff changeset
   177
    TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::GetInfoThread() - END - ret: %d", r));
hgs
parents:
diff changeset
   178
    return r;
hgs
parents:
diff changeset
   179
	}
hgs
parents:
diff changeset
   180
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
TInt DMemSpyDriverLogChanThreadAndProcess::GetInfoProcess( TUint aPid, TMemSpyDriverProcessInfo* aParams )
hgs
parents:
diff changeset
   183
	{
hgs
parents:
diff changeset
   184
    TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::GetInfoProcess() - START"));
hgs
parents:
diff changeset
   185
hgs
parents:
diff changeset
   186
    TMemSpyDriverProcessInfo params;
hgs
parents:
diff changeset
   187
    TInt r = Kern::ThreadRawRead( &ClientThread(), aParams, &params, sizeof(TMemSpyDriverProcessInfo) );
hgs
parents:
diff changeset
   188
    if  ( r != KErrNone )
hgs
parents:
diff changeset
   189
        {
hgs
parents:
diff changeset
   190
    	TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::GetInfoProcess() - END - params read error: %d", r));
hgs
parents:
diff changeset
   191
        return r;
hgs
parents:
diff changeset
   192
        }
hgs
parents:
diff changeset
   193
hgs
parents:
diff changeset
   194
	r = OpenTempObject( aPid, EProcess );
hgs
parents:
diff changeset
   195
	if  ( r == KErrNone )
hgs
parents:
diff changeset
   196
		{
hgs
parents:
diff changeset
   197
        DMemSpyDriverOSAdaptionDProcess& processAdaptor = OSAdaption().DProcess();
hgs
parents:
diff changeset
   198
  
hgs
parents:
diff changeset
   199
        DProcess* process = (DProcess*) TempObject();
hgs
parents:
diff changeset
   200
  	    NKern::ThreadEnterCS();
hgs
parents:
diff changeset
   201
		//
hgs
parents:
diff changeset
   202
        params.iFlags = processAdaptor.GetFlags( *process );
hgs
parents:
diff changeset
   203
        params.iGeneration = processAdaptor.GetGeneration( *process );
hgs
parents:
diff changeset
   204
        params.iSecurityInfo = processAdaptor.GetSecurityInfo( *process );
hgs
parents:
diff changeset
   205
hgs
parents:
diff changeset
   206
        // Write back to user-side
hgs
parents:
diff changeset
   207
        r = Kern::ThreadRawWrite( &ClientThread(), aParams, &params, sizeof(TMemSpyDriverProcessInfo) );
hgs
parents:
diff changeset
   208
	    NKern::ThreadLeaveCS();
hgs
parents:
diff changeset
   209
		CloseTempObject();
hgs
parents:
diff changeset
   210
		}
hgs
parents:
diff changeset
   211
hgs
parents:
diff changeset
   212
    TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::GetInfoProcess() - END - ret: %d", r));
hgs
parents:
diff changeset
   213
    return r;
hgs
parents:
diff changeset
   214
	}
hgs
parents:
diff changeset
   215
hgs
parents:
diff changeset
   216
hgs
parents:
diff changeset
   217
hgs
parents:
diff changeset
   218
hgs
parents:
diff changeset
   219
hgs
parents:
diff changeset
   220
hgs
parents:
diff changeset
   221
hgs
parents:
diff changeset
   222
hgs
parents:
diff changeset
   223
hgs
parents:
diff changeset
   224
TInt DMemSpyDriverLogChanThreadAndProcess::EndThread( TUint aId, TExitType aType )
hgs
parents:
diff changeset
   225
    {
hgs
parents:
diff changeset
   226
    TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::EndThread() - START - aId: %d, aType: %d", aId, aType ));
hgs
parents:
diff changeset
   227
hgs
parents:
diff changeset
   228
	TInt r = OpenTempObject( aId, EThread );
hgs
parents:
diff changeset
   229
	if  ( r == KErrNone )
hgs
parents:
diff changeset
   230
		{
hgs
parents:
diff changeset
   231
        DThread* thread = (DThread*) TempObject();
hgs
parents:
diff changeset
   232
        //
hgs
parents:
diff changeset
   233
        const TInt reason = MapToMemSpyExitReason( aType );
hgs
parents:
diff changeset
   234
        Kern::ThreadKill( thread, aType, reason, KMemSpyClientPanic );
hgs
parents:
diff changeset
   235
        //
hgs
parents:
diff changeset
   236
	    CloseTempObject();
hgs
parents:
diff changeset
   237
        }
hgs
parents:
diff changeset
   238
    else
hgs
parents:
diff changeset
   239
        {
hgs
parents:
diff changeset
   240
        r = KErrNotFound;
hgs
parents:
diff changeset
   241
        }
hgs
parents:
diff changeset
   242
hgs
parents:
diff changeset
   243
	TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::EndThread() - END - r: %d", r));
hgs
parents:
diff changeset
   244
	return r;
hgs
parents:
diff changeset
   245
    }
hgs
parents:
diff changeset
   246
hgs
parents:
diff changeset
   247
hgs
parents:
diff changeset
   248
hgs
parents:
diff changeset
   249
hgs
parents:
diff changeset
   250
hgs
parents:
diff changeset
   251
hgs
parents:
diff changeset
   252
hgs
parents:
diff changeset
   253
hgs
parents:
diff changeset
   254
hgs
parents:
diff changeset
   255
hgs
parents:
diff changeset
   256
hgs
parents:
diff changeset
   257
hgs
parents:
diff changeset
   258
hgs
parents:
diff changeset
   259
hgs
parents:
diff changeset
   260
hgs
parents:
diff changeset
   261
hgs
parents:
diff changeset
   262
hgs
parents:
diff changeset
   263
hgs
parents:
diff changeset
   264
hgs
parents:
diff changeset
   265
hgs
parents:
diff changeset
   266
hgs
parents:
diff changeset
   267
hgs
parents:
diff changeset
   268
TInt DMemSpyDriverLogChanThreadAndProcess::OpenThread( TUint aId )
hgs
parents:
diff changeset
   269
    {
hgs
parents:
diff changeset
   270
	TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::OpenThread() - START - aId: %d", aId));
hgs
parents:
diff changeset
   271
hgs
parents:
diff changeset
   272
	TInt r = OpenTempObject( aId, EThread, KMemSpyDriverAllowDeadOpenRequests );
hgs
parents:
diff changeset
   273
	TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::OpenThread() - done open temp object, r: %d", r ));
hgs
parents:
diff changeset
   274
	if  ( r == KErrNone )
hgs
parents:
diff changeset
   275
		{
hgs
parents:
diff changeset
   276
        NKern::ThreadEnterCS();
hgs
parents:
diff changeset
   277
        DThread* threadToOpen = (DThread*) TempObject();
hgs
parents:
diff changeset
   278
        TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::OpenThread() - thread exit type: %d", threadToOpen->iExitType ));
hgs
parents:
diff changeset
   279
hgs
parents:
diff changeset
   280
        TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::OpenThread() - making handle..." ));
hgs
parents:
diff changeset
   281
        r = Kern::MakeHandleAndOpen( &ClientThread(), threadToOpen );
hgs
parents:
diff changeset
   282
	    TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::OpenThread() - handle: %d",r ));
hgs
parents:
diff changeset
   283
    	NKern::ThreadLeaveCS();
hgs
parents:
diff changeset
   284
hgs
parents:
diff changeset
   285
        // Balance reference count, handle is still open and mapped into our process since we opened
hgs
parents:
diff changeset
   286
        // it above via MakeHandleAndOpen
hgs
parents:
diff changeset
   287
	    TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::OpenThread() - closing temp object..." ));
hgs
parents:
diff changeset
   288
	    CloseTempObject();
hgs
parents:
diff changeset
   289
	    TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::OpenThread() - closed temp object" ));
hgs
parents:
diff changeset
   290
        }
hgs
parents:
diff changeset
   291
    else
hgs
parents:
diff changeset
   292
        {
hgs
parents:
diff changeset
   293
        r = KErrNotFound;
hgs
parents:
diff changeset
   294
        }
hgs
parents:
diff changeset
   295
hgs
parents:
diff changeset
   296
	TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::OpenThread() - END - r: %d", r));
hgs
parents:
diff changeset
   297
	return r;
hgs
parents:
diff changeset
   298
    }
hgs
parents:
diff changeset
   299
hgs
parents:
diff changeset
   300
hgs
parents:
diff changeset
   301
TInt DMemSpyDriverLogChanThreadAndProcess::OpenProcess( TUint aId )
hgs
parents:
diff changeset
   302
    {
hgs
parents:
diff changeset
   303
	TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::OpenProcess() - START - aId: %d", aId));
hgs
parents:
diff changeset
   304
hgs
parents:
diff changeset
   305
	TInt r = OpenTempObject( aId, EProcess, KMemSpyDriverAllowDeadOpenRequests );
hgs
parents:
diff changeset
   306
	if  ( r == KErrNone )
hgs
parents:
diff changeset
   307
		{
hgs
parents:
diff changeset
   308
        NKern::ThreadEnterCS();
hgs
parents:
diff changeset
   309
        DProcess* processToOpen = (DProcess*) TempObject();
hgs
parents:
diff changeset
   310
        r = Kern::MakeHandleAndOpen( &ClientThread(), processToOpen );
hgs
parents:
diff changeset
   311
    	NKern::ThreadLeaveCS();
hgs
parents:
diff changeset
   312
hgs
parents:
diff changeset
   313
        // Balance reference count, handle is still open and mapped into our process since we opened
hgs
parents:
diff changeset
   314
        // it above via MakeHandleAndOpen
hgs
parents:
diff changeset
   315
	    CloseTempObject();
hgs
parents:
diff changeset
   316
        }
hgs
parents:
diff changeset
   317
    else
hgs
parents:
diff changeset
   318
        {
hgs
parents:
diff changeset
   319
        r = KErrNotFound;
hgs
parents:
diff changeset
   320
        }
hgs
parents:
diff changeset
   321
hgs
parents:
diff changeset
   322
	TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::OpenProcess() - END - r: %d", r));
hgs
parents:
diff changeset
   323
	return r;
hgs
parents:
diff changeset
   324
    }
hgs
parents:
diff changeset
   325
hgs
parents:
diff changeset
   326
hgs
parents:
diff changeset
   327
hgs
parents:
diff changeset
   328
hgs
parents:
diff changeset
   329
hgs
parents:
diff changeset
   330
hgs
parents:
diff changeset
   331
hgs
parents:
diff changeset
   332
hgs
parents:
diff changeset
   333
hgs
parents:
diff changeset
   334
hgs
parents:
diff changeset
   335
hgs
parents:
diff changeset
   336
hgs
parents:
diff changeset
   337
hgs
parents:
diff changeset
   338
hgs
parents:
diff changeset
   339
hgs
parents:
diff changeset
   340
hgs
parents:
diff changeset
   341
hgs
parents:
diff changeset
   342
hgs
parents:
diff changeset
   343
hgs
parents:
diff changeset
   344
hgs
parents:
diff changeset
   345
hgs
parents:
diff changeset
   346
hgs
parents:
diff changeset
   347
hgs
parents:
diff changeset
   348
hgs
parents:
diff changeset
   349
hgs
parents:
diff changeset
   350
hgs
parents:
diff changeset
   351
hgs
parents:
diff changeset
   352
hgs
parents:
diff changeset
   353
hgs
parents:
diff changeset
   354
TInt DMemSpyDriverLogChanThreadAndProcess::SuspendAllThreadsInProcess( TUint aPid )
hgs
parents:
diff changeset
   355
    {
hgs
parents:
diff changeset
   356
	TRACE( Kern::Printf( "DMemSpyDriverLogChanThreadAndProcess::SuspendAllThreadsInProcess() - START - aPid: %d", aPid ));
hgs
parents:
diff changeset
   357
hgs
parents:
diff changeset
   358
    DMemSpySuspensionManager& susMan = SuspensionManager();
hgs
parents:
diff changeset
   359
    const TInt err = susMan.SuspendAllThreadsInProcess( aPid, ClientThread() );
hgs
parents:
diff changeset
   360
hgs
parents:
diff changeset
   361
	TRACE( Kern::Printf( "DMemSpyDriverLogChanThreadAndProcess::SuspendAllThreadsInProcess() - END - aPid: %d, err: %d", aPid, err ));
hgs
parents:
diff changeset
   362
	return err;
hgs
parents:
diff changeset
   363
    }
hgs
parents:
diff changeset
   364
hgs
parents:
diff changeset
   365
hgs
parents:
diff changeset
   366
TInt DMemSpyDriverLogChanThreadAndProcess::ResumeAllThreadsInProcess( TUint aPid )
hgs
parents:
diff changeset
   367
    {
hgs
parents:
diff changeset
   368
	TRACE( Kern::Printf( "DMemSpyDriverLogChanThreadAndProcess::ResumeAllThreadsInProcess() - START - aPid: %d", aPid ));
hgs
parents:
diff changeset
   369
hgs
parents:
diff changeset
   370
    DMemSpySuspensionManager& susMan = SuspensionManager();
hgs
parents:
diff changeset
   371
    const TInt err = susMan.ResumeAllThreadsInProcess( aPid, ClientThread() );
hgs
parents:
diff changeset
   372
hgs
parents:
diff changeset
   373
	TRACE( Kern::Printf( "DMemSpyDriverLogChanThreadAndProcess::ResumeAllThreadsInProcess() - END - aPid: %d, err: %d", aPid, err ));
hgs
parents:
diff changeset
   374
	return err;
hgs
parents:
diff changeset
   375
    }
hgs
parents:
diff changeset
   376
hgs
parents:
diff changeset
   377
hgs
parents:
diff changeset
   378
TInt DMemSpyDriverLogChanThreadAndProcess::GetThreadsForProcess( TUint aPid, TDes8* aBufferSink )
hgs
parents:
diff changeset
   379
    {
hgs
parents:
diff changeset
   380
	TRACE( Kern::Printf( "DMemSpyDriverLogChanThreadAndProcess::GetThreadsForProcess() - START - aPid: %d", aPid ) );
hgs
parents:
diff changeset
   381
hgs
parents:
diff changeset
   382
    // We open the source thread or process, just to ensure it doesn't die underneath us...
hgs
parents:
diff changeset
   383
    TInt r = OpenTempObject( aPid, EProcess );
hgs
parents:
diff changeset
   384
    if  ( r == KErrNone )
hgs
parents:
diff changeset
   385
		{
hgs
parents:
diff changeset
   386
		DProcess& process = TempObjectAsProcess();
hgs
parents:
diff changeset
   387
hgs
parents:
diff changeset
   388
        // Open stream
hgs
parents:
diff changeset
   389
        RMemSpyMemStreamWriter stream = OpenXferStream();
hgs
parents:
diff changeset
   390
        TRACE( Kern::Printf( "DMemSpyDriverLogChanThreadAndProcess::GetThreadsForProcess() - stream remaining: %d", stream.Remaining() ) ); 
hgs
parents:
diff changeset
   391
hgs
parents:
diff changeset
   392
        // Save marker pos for the thread count - we'll update it after the loop
hgs
parents:
diff changeset
   393
        TInt count = 0;
hgs
parents:
diff changeset
   394
        TInt32* pCountMarkerThread = stream.WriteInt32( 0 );
hgs
parents:
diff changeset
   395
hgs
parents:
diff changeset
   396
        DMemSpyDriverOSAdaptionDProcess& processAdaptor = OSAdaption().DProcess();
hgs
parents:
diff changeset
   397
        SDblQue& threadQueue = processAdaptor.GetThreadQueue( process );
hgs
parents:
diff changeset
   398
        SDblQueLink* pLink = threadQueue.First();
hgs
parents:
diff changeset
   399
		while( pLink != & threadQueue.iA && !stream.IsFull() )
hgs
parents:
diff changeset
   400
			{
hgs
parents:
diff changeset
   401
			DThread* pT = processAdaptor.GetThread( pLink );
hgs
parents:
diff changeset
   402
            //
hgs
parents:
diff changeset
   403
            if  ( pT )
hgs
parents:
diff changeset
   404
                {
hgs
parents:
diff changeset
   405
                const TUint tid = OSAdaption().DThread().GetId( *pT );
hgs
parents:
diff changeset
   406
                TRACE( Kern::Printf( "DMemSpyDriverLogChanThreadAndProcess::GetThreadsForProcess() - id: %d (0x%04x)", tid, tid ) );
hgs
parents:
diff changeset
   407
                stream.WriteUint32( tid );
hgs
parents:
diff changeset
   408
                }
hgs
parents:
diff changeset
   409
hgs
parents:
diff changeset
   410
            pLink = pLink->iNext;
hgs
parents:
diff changeset
   411
			++count;
hgs
parents:
diff changeset
   412
            }
hgs
parents:
diff changeset
   413
 
hgs
parents:
diff changeset
   414
        if  ( stream.IsFull() )
hgs
parents:
diff changeset
   415
            {
hgs
parents:
diff changeset
   416
            Kern::Printf( "DMemSpyDriverLogChanThreadAndProcess::GetThreadsForProcess() - STREAM FULL - id: %d (0x%04x), thread: %O", process.iId, process.iId, &process );
hgs
parents:
diff changeset
   417
            }
hgs
parents:
diff changeset
   418
hgs
parents:
diff changeset
   419
        // Now write the count
hgs
parents:
diff changeset
   420
        *pCountMarkerThread = count;
hgs
parents:
diff changeset
   421
hgs
parents:
diff changeset
   422
        // Tidy up
hgs
parents:
diff changeset
   423
        r = stream.WriteAndClose( aBufferSink );
hgs
parents:
diff changeset
   424
        TRACE( Kern::Printf( "DMemSpyDriverLogChanThreadAndProcess::GetThreadsForProcess() - r: %d, count: %d", r, count ));
hgs
parents:
diff changeset
   425
hgs
parents:
diff changeset
   426
        CloseTempObject();
hgs
parents:
diff changeset
   427
        }
hgs
parents:
diff changeset
   428
hgs
parents:
diff changeset
   429
	TRACE( Kern::Printf( "DMemSpyDriverLogChanThreadAndProcess::GetThreadsForProcess() - END - aPid: %d, err: %d", aPid, r ));
hgs
parents:
diff changeset
   430
	return r;
hgs
parents:
diff changeset
   431
    }
hgs
parents:
diff changeset
   432
hgs
parents:
diff changeset
   433
hgs
parents:
diff changeset
   434
TInt DMemSpyDriverLogChanThreadAndProcess::SetPriority( TUint aId, TThreadPriority aPriority )
hgs
parents:
diff changeset
   435
    {
hgs
parents:
diff changeset
   436
    TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::SetPriority(T) - START - aId: %d, aPriority: %d", aId, aPriority ));
hgs
parents:
diff changeset
   437
hgs
parents:
diff changeset
   438
	TInt r = OpenTempObject( aId, EThread );
hgs
parents:
diff changeset
   439
	TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::SetPriority(T) - done open temp object, r: %d", r ));
hgs
parents:
diff changeset
   440
	if  ( r == KErrNone )
hgs
parents:
diff changeset
   441
		{
hgs
parents:
diff changeset
   442
        // Map user side thread priority to kernel-side absolute thread priority (typically 0-63)
hgs
parents:
diff changeset
   443
        const TInt kernelThreadPri = MemSpyDriverUtils::MapToAbsoluteThreadPriority( aPriority );
hgs
parents:
diff changeset
   444
        TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::SetPriority(T) - user: %d, kernel absolute: %d", aPriority, kernelThreadPri ));
hgs
parents:
diff changeset
   445
hgs
parents:
diff changeset
   446
        if  ( kernelThreadPri > 0 && kernelThreadPri < KNumPriorities )
hgs
parents:
diff changeset
   447
            {
hgs
parents:
diff changeset
   448
            NKern::ThreadEnterCS();
hgs
parents:
diff changeset
   449
            DThread& thread = TempObjectAsThread();
hgs
parents:
diff changeset
   450
            r = Kern::SetThreadPriority( kernelThreadPri, &thread );
hgs
parents:
diff changeset
   451
            TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::SetPriority(T) - Kern::SetThreadPriority() returned: %d", r ));
hgs
parents:
diff changeset
   452
    	    NKern::ThreadLeaveCS();
hgs
parents:
diff changeset
   453
            }
hgs
parents:
diff changeset
   454
        else
hgs
parents:
diff changeset
   455
            {
hgs
parents:
diff changeset
   456
            // Error
hgs
parents:
diff changeset
   457
            r = kernelThreadPri;
hgs
parents:
diff changeset
   458
            }
hgs
parents:
diff changeset
   459
hgs
parents:
diff changeset
   460
        CloseTempObject();
hgs
parents:
diff changeset
   461
        }
hgs
parents:
diff changeset
   462
hgs
parents:
diff changeset
   463
    TRACE( Kern::Printf("DMemSpyDriverLogChanThreadAndProcess::SetPriority(T) - END - r: %d", r));
hgs
parents:
diff changeset
   464
	return r;
hgs
parents:
diff changeset
   465
    }
hgs
parents:
diff changeset
   466
hgs
parents:
diff changeset
   467
hgs
parents:
diff changeset
   468
hgs
parents:
diff changeset
   469
hgs
parents:
diff changeset
   470
hgs
parents:
diff changeset
   471
hgs
parents:
diff changeset
   472
TInt DMemSpyDriverLogChanThreadAndProcess::MapToMemSpyExitReason( TExitType aType )
hgs
parents:
diff changeset
   473
    {
hgs
parents:
diff changeset
   474
    TInt ret = 0;
hgs
parents:
diff changeset
   475
    //
hgs
parents:
diff changeset
   476
    switch( aType )
hgs
parents:
diff changeset
   477
        {
hgs
parents:
diff changeset
   478
    default:
hgs
parents:
diff changeset
   479
    case EExitKill:
hgs
parents:
diff changeset
   480
        ret = EPanicForcedKill;
hgs
parents:
diff changeset
   481
        break;
hgs
parents:
diff changeset
   482
    case EExitTerminate:
hgs
parents:
diff changeset
   483
        ret = EPanicForcedTerminate;
hgs
parents:
diff changeset
   484
        break;
hgs
parents:
diff changeset
   485
    case EExitPanic:
hgs
parents:
diff changeset
   486
        ret = EPanicForcedPanic;
hgs
parents:
diff changeset
   487
        break;
hgs
parents:
diff changeset
   488
        }
hgs
parents:
diff changeset
   489
    //
hgs
parents:
diff changeset
   490
    return ret;
hgs
parents:
diff changeset
   491
    }
hgs
parents:
diff changeset
   492
hgs
parents:
diff changeset
   493
hgs
parents:
diff changeset
   494
hgs
parents:
diff changeset
   495
hgs
parents:
diff changeset
   496
hgs
parents:
diff changeset
   497
hgs
parents:
diff changeset
   498
hgs
parents:
diff changeset
   499
hgs
parents:
diff changeset
   500
hgs
parents:
diff changeset
   501
hgs
parents:
diff changeset
   502
hgs
parents:
diff changeset
   503
hgs
parents:
diff changeset
   504
hgs
parents:
diff changeset
   505
hgs
parents:
diff changeset
   506
hgs
parents:
diff changeset
   507
hgs
parents:
diff changeset
   508
hgs
parents:
diff changeset
   509
hgs
parents:
diff changeset
   510
hgs
parents:
diff changeset
   511